{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第三章　随机抽样\n",
    "\n",
    "\n",
    "作者：[王何宇](http://person.zju.edu.cn/wangheyu)\n",
    "\n",
    "[浙江大学数学科学学院](http://www.math.zju.edu.cn)\n",
    "\n",
    "上一章我们讨论了最简单的随机分布，均匀分布随机数的产生方法。有了这个均\n",
    "匀分布随机数的基础，这一章我们将进一步讨论如何产生各种所需的随机变量和\n",
    "随机过程。首先我们回顾一下概率论的一些基本定义。\n",
    "\n",
    "## 基础知识回顾\n",
    "我们用概率分布来描述一个随机变量服从的分布规律，具体来说，离散型随机变\n",
    "量的概率分布称为"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**概率质量函数（Probability Mass Function, PMF)**\n",
    "若离散型随机变量 $\\xi$ 取值为 $x_1, x_2, \\cdots, x_n$ 的概率分别为 $p_1, p_2, \\cdots, p_n$, 即\n",
    "$$\n",
    "\\begin{equation}\n",
    "    P(\\xi = x_i) = p_i, i = 1, 2, \\cdots, n,\n",
    "    \\label{eq::dis_df}\n",
    "\\end{equation}\n",
    "$$\n",
    "则其概率分布函数\n",
    "$$  \n",
    "\\begin{equation}\n",
    "f(x) = \\left\\{\n",
    "    \\begin{array}{ll}\n",
    "      p_i, & x \\in S,\\\\\n",
    "      0, & x \\in \\mathbb{R}\\setminus S\n",
    "    \\end{array}\\right.\n",
    "    \\label{eq::dis_pmf}\n",
    "  \\end{equation}\n",
    "$$\n",
    "又称为概率质量函数，简称为 PMF。其中 $S = \\{x_1, x_2, \\cdots, x_n\\}$ 称为样本集。显然，在离散的情形下，有\n",
    "$$\n",
    "\\sum_{x_i \\in S}p_i = \\sum_{i = 1}^np_i = 1.\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**累积分布函数（Cumulative Distribution Function, CDF）**\n",
    "称\n",
    "$$\n",
    "  \\begin{equation}\n",
    "    F(x) = P(\\xi \\leq x) = \\sum_{x_i \\leq x}p_i, x \\in \\mathbb{R}\n",
    "    \\label{eq::dis_cdf}\n",
    "  \\end{equation}\n",
    "$$  \n",
    "为累积分布函数，简称为CDF。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**两点分布** 两点分布的 PMF 为\n",
    "$$\n",
    "  \\begin{equation}\n",
    "    f(x) = \\left\\{\\begin{array}{ll}\n",
    "    0.5, &x = 0; \\\\\n",
    "    0.5, &x = 1;\\\\\n",
    "    0, &x \\notin \\{0, 1\\}.\n",
    "    \\end{array}\\right.\n",
    "    \\label{eq::2p_PMF}\n",
    "  \\end{equation}\n",
    "$$  \n",
    "对应的CDF为\n",
    "$$  \n",
    "\\begin{equation}\n",
    "    F(x) = \\left\\{\\begin{array}{ll}\n",
    "    0, & x < 0; \\\\\n",
    "    0.5, &0 \\leq x < 1; \\\\\n",
    "    1, &x = 1.\n",
    "    \\end{array}\\right.\n",
    "    \\label{eq::2p_CDF}\n",
    "  \\end{equation}\n",
    "$$  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "更常见的，离散型随机变量的特征会像下面那样表示。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**二项分布** 的PMF一般写做\n",
    "$$\n",
    "\\begin{equation}\n",
    "  b(k; n, p) = \\binom{n}{k}p^k(1 - p)^{n - k}, 0 < p < 1, k = 0, 1, \\cdots, n.\n",
    "  \\label{eq::binom_PMF}\n",
    "\\end{equation}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "随机模拟的一个重要步骤是根据需要产生服从各种分布的样本集。之前我们已经讨论过如何产生服从 $U(0, 1)$ 的均匀分布的随机数，那么现在，我们就要从服从 $U(0, 1)$ 的均匀分布的随机序列出发，产生独立同分布的目标随机数序列。这里两个问题的解决是各自独立的。首先随机序列的独立性完全由均匀分布的随机序列的独立性决定，这在上一章已经讨论。我们接下去主要讨论如何确保随机序列同分布，也即和要求的目标分布一致。这里还有一个重要问题是产生效率，因为我们必须在计算机上算法实现。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 直接抽样方法\n",
    "\n",
    "如果随机变量的 PMF 是已知的，那么我们可以从均匀分布的随机数出发，直接根据概率论定义构建抽样算法。这种方法称为直接抽样方法。即产生均匀分布的随机序列，然后通过某种变换或抽取，使得从中变换抽取后的随机数样本集 $X$ 服从 $F(x)$，这里 $F(x)$ 是已知积累分布函数。也即要求 $\\forall \\xi \\sim F$，\n",
    "$$\n",
    "\\begin{equation}\n",
    "  P(\\xi \\leq x) = F(x), x \\in \\mathbb{R}.\n",
    "  \\label{eq::def_cdf}\n",
    "\\end{equation}\n",
    "$$\n",
    "这里，一方面，我们要从算法保证（证明）$X$ 确实服从指定分布 $F(x)$；另一方面，对于一个实际的产生的抽样结果，也要能通过指定的统计检验。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 逆变换算法\n",
    "\n",
    "1947 年，曼哈顿计划的参与者 Stanislaw Marein Ulam 提出了逆变换算法，注意到随机变量 $\\xi$ 的累积分布函数 $F(x): \\mathbb{R} \\mapsto [0, 1]$ 是非降的，故定义其逆函数为\n",
    "$$\n",
    "\\begin{equation}\n",
    "  F^{-1}: [0, 1] \\mapsto \\mathbb{R}, F^{-1}(y) = \\inf \\{x \\left| F(x).\n",
    "  \\geq y \\right.\\}\n",
    "  \\label{eq::inv_cdf}\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "**证明：** $\\forall x \\in \\mathbb{R}$，\n",
    "$$\n",
    "  \\begin{equation}\n",
    "    P(\\xi \\leq x) = P(F^{-1}(\\eta) \\leq x) = P(\\eta \\leq F(x)) = F(x).\n",
    "    \\label{eq::prof_inv_cdf}\n",
    "  \\end{equation}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "所以我们算法的设计思路就是对一个均匀分布的随机数序列 $U$，求其逆变换 $X = F^{-1}(U)$，则 $X$ 的分布服从 $F(x)$。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 列表查找法\n",
    "\n",
    "这种做法一般针对离散分布，特别是能给出分布表的离散分布。若离散分布的 PMF 表为\n",
    "$$\n",
    "\\begin{array}{cccc}\n",
    "  x_0 & x_1 & \\cdots & x_n \\\\\n",
    "  p_0 & p_1 & \\cdots & p_n,\n",
    "\\end{array}\n",
    "$$\n",
    "且 $x_0 < x_1 < \\cdots < x_n$, 则我们不难构建CDF表\n",
    "$$\n",
    "\\begin{array}{cccccc}\n",
    "  x_0 & x_1 & \\cdots & x_k & \\cdots & x_n \\\\\n",
    "  F_0 = p_0 & F_1 = p_0 +  p_1 & \\cdots\n",
    "  & F_k = \\sum_{i = 0}^k p_i & \\cdots & F_n \\equiv 1.\n",
    "\\end{array}\n",
    "$$\n",
    "根据 PMF 定义，$\\forall x \\notin \\{x_0, x_1, \\cdots, x_n\\}$，有$f(x) = 0$，故我们可以认为 $F_{-1} = 0$。\n",
    "现在对$\\eta \\sim U(0, 1)$, 必有$0 \\leq k \\leq n$（为什么？）, 满足\n",
    "$$\n",
    "\\begin{equation}\n",
    "  \\label{eq::def_dis_pmf}\n",
    "F_{k - 1} < \\eta \\leq F_k,\n",
    "\\end{equation}\n",
    "$$\n",
    "则可取 $\\xi = x_k$。从PMF角度，就是\n",
    "$$\n",
    "\\begin{equation}\n",
    "  \\xi = \\min\\left\\{x_k\\left|\\eta \\leq \\sum_{i = 0}^kf(x_i)\\right.\\right\\}, \\eta \\sim U(0, 1).\n",
    "  \\label{eq::dis_inv}\n",
    "\\end{equation}\n",
    "$$\n",
    "在具体的抽取算法中，这一过程就是查表。对于较长的表，可以采用二分查找。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from __future__ import print_function, division\n",
    "\n",
    "# 这句话是非标准的python，用于ipthon或jupyter这样的系统中，表示绘图即刻自动展开。\n",
    "%matplotlib inline\n",
    "\n",
    "# 这里把全部Warning过滤掉了. \n",
    "# 参见https://docs.python.org/2/library/warnings.html\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "from scipy.special import comb, perm\n",
    "from scipy import stats\n",
    "import numpy as np\n",
    "import sys\n",
    "import matplotlib.pyplot as plt\n",
    "np.random.seed(250)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 离散分布举例\n",
    "下面产生一个服从$n，p$的二项分布。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "n = 10\n",
    "p = 0.3\n",
    "k = np.arange(0, n + 1, 1)\n",
    "# 生成器，在具体调用时产生序列。\n",
    "PMF = [stats.binom.pmf(i, n, p) for i in k] "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.028247524900000005, 0.12106082100000018, 0.2334744405, 0.26682793200000016, 0.20012094900000013, 0.10291934520000007, 0.03675690899999999, 0.009001692000000002, 0.0014467004999999982, 0.00013778100000000015, 5.904899999999995e-06]\n"
     ]
    }
   ],
   "source": [
    "print(PMF) # 表格中数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下去绘制PMF和CDF的插图。这里也可以学习一下Python如何绘图。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for i in k:\n",
    "    plt.plot([k[i], k[i]],[0,PMF[i]],'b-') # 画n + 1条直线。\n",
    "    plt.plot(k[i], PMF[i],'bo') # 顶部画个点。\n",
    "plt.xticks(fontsize=15) # 调整一下标记字体。\n",
    "plt.yticks(fontsize=15)\n",
    "plt.xlabel(r'PMF',fontsize=15) # 加标题。\n",
    "plt.savefig('PMF_bin.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "将PMF累加即得离散分布的CDF，也即\n",
    "$$\n",
    "F(x_k) = \\sum_{-\\infty}^k f(x_i).\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "c = 0\n",
    "CDF = [0]*(n + 1)\n",
    "for i in range(n):\n",
    "    c += PMF[i]\n",
    "    CDF[i] = c\n",
    "    plt.plot([k[i], k[i + 1]],[c, c],'b-') \n",
    "    # ''表示无颜色，但又给了edgecolors，就是为了画个空圈。s是大小。\n",
    "    plt.scatter(k[i + 1], c, color='', marker='o', edgecolors='b', s=40)\n",
    "    plt.scatter(k[i], c, color='b',marker='o', s=40)\n",
    "plt.scatter(0, 0, color='',marker='o', edgecolors='b', s=40)\n",
    "plt.scatter(n, 1, color='b',marker='o', s=40)\n",
    "plt.xticks(fontsize=15)\n",
    "plt.yticks(fontsize=15)\n",
    "plt.xlabel(r'CDF',fontsize=15)\n",
    "plt.savefig('CDF_bin.pdf')\n",
    "CDF[n] = 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "构建一个用于二分法查表的函数。稍微有一些针对性处理。关于二分查找和递归过程的内容可参考MIT的网络公开课《算法导论》，03年版。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def bisection_search(F, eta, start, end):\n",
    "    if (eta <= F[start]):\n",
    "        return start\n",
    "    n = end - start\n",
    "    if (n <= 0):\n",
    "        sys.exit()\n",
    "    k = (start + end) // 2\n",
    "    if (eta > F[k]):\n",
    "        if (eta <= F[k + 1]):\n",
    "            return k + 1\n",
    "        else:\n",
    "            return bisection_search(F, eta, k + 1, end)\n",
    "    else:\n",
    "        return bisection_search(F, eta, start, k)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "做1000000次随机抽取，形成二项分布的随机序列X。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "U = np.random.rand(1000000)\n",
    "X = [bisection_search(CDF, U[i], 0, n) for i in range(1000000)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用统计来验证我们生成的随机序列确实服从目标分布。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.hist(X, normed=True, label=\"Stat. of the Sampling\");\n",
    "plt.plot(PMF, label=r\"PMF, $b(10, 0.3)$\")\n",
    "plt.legend()\n",
    "plt.xlabel(r\"Statistical Test of the Samples\")\n",
    "plt.savefig('test_bin.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "实测结果和理论符合的很好。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 连续分布的情形\n",
    "而对于连续型随机变量，可以看作是离散型随机变量的一种极限情形。此时概率分布无法逐点定义，而是定义在样本集内的正测度集上，即考察随机变量落在一个正测度集内的概率是多少。而从这个角度我们发现，之前在定义所引入的累积分布函数\n",
    "$$\n",
    "F(x) = P(\\xi \\leq x), x \\in \\mathbb{R}\n",
    "$$\n",
    "对连续型随机变量仍然适用，而在此基础上，可进一步引入直观上“概率如何在一点上的定义”。由于一点是零测度集，所以这种定义无法脱离正测度集的概\n",
    "念独立存在，而被看作“微元正测度集”的概率。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**概率密度函数（Probability Density Function, PDF）** 对连续型随机变量，$\\forall x \\in \\mathbb{R}$, 我们仍称\n",
    "$$\n",
    "  \\begin{equation}\n",
    "    F(x) = P(\\xi \\leq x), x \\in \\mathbb{R}\n",
    "    \\label{eq::df}\n",
    "  \\end{equation}\n",
    "$$  \n",
    "为累计分布函数，若存在某个非负的可积函数 $f(x)$，满足\n",
    "$$\n",
    "  \\begin{equation}\n",
    "    F(x) = \\int_{-\\infty}^x f(y) dy, \\forall x \\in \\mathbb{R},\n",
    "    \\label{eq::pdf}\n",
    "  \\end{equation}\n",
    "$$  \n",
    "则称 $f(x)$ 为对应随机分布的概率密度函数，简称为PDF。此时，\n",
    "$$\n",
    "  \\begin{equation}\n",
    "    f(x) = F'(x).\n",
    "    \\label{eq::pdf2cdf}\n",
    "  \\end{equation}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "注意到我们之前定义的针对离散型随机变量的 PMF，事实上和这里定义的 PDF 并无冲突，甚至可以看作是 PDF 的一个特例（这里要看你如何定义积分了）。关于逆变换的定义也可以完全沿用。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于连续分布的采样抽取，如果存在容易计算的逆变换解析表达式 $F^{-1}(y)$，那么对于 $U(0, 1)$ 的均匀分布的随机变量 $\\eta$，直接计算 $F^{-1}(\\eta)$ 即可。也就是说，\n",
    "$$\n",
    "\\begin{equation}\n",
    "  \\xi = \\min\\left\\{x \\left|\\eta \\leq \\int_{-\\infty}^x f(t)\n",
    "  dt\\right.\\right\\} = F^{-1}(\\eta), \\eta \\sim U(0, 1),\n",
    "  \\label{eq::inv}\n",
    "\\end{equation}\n",
    "$$\n",
    "则 $\\xi \\sim f(x)$。下面算法给出了Rayleigh分布逆变换抽样的实现。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 连续分布举例\n",
    "下面是连续情形的逆变换直接抽样。如果能写出逆变换的解析形式，而且便于计算，那么整个过程非常直接方便。这是一个Rayleigh分布直接抽样的例子。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sample_Rayleigh(U, sigma):\n",
    "    return [np.sqrt(-2 * sigma**2 * np.log(u)) for u in U]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "还是直接抽样1000000次。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "U = np.random.rand(1000000)\n",
    "X = sample_Rayleigh(U, 0.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "同样的，我们需要统计验证。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "s = 0.5\n",
    "x = np.linspace(0,6,10000)\n",
    "f = (x/s**2) * np.exp(-x**2/(2 * s**2))\n",
    "plt.hist(X, bins=50,normed=True, label=\"Stat. of the Sampling\");\n",
    "plt.plot(x, f, label=r\"PDF of Rayleigh Distribution, $\\sigma = 0.5$\")\n",
    "plt.legend()\n",
    "plt.xlabel(r\"Statistical Test of Rayleigh Samples by Inverse Transform Method\")\n",
    "plt.savefig('Ray_inv.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里hist的参数bins=50代表了做统计的区间分段数，由于我们的样本数足够，这个数字越大，统计图会越连续。下面是指数分布："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sample_Exponential(U, beta):\n",
    "    return [-beta * np.log(u) for u in U]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5,0,'Statistical Test of Exponential Samples by Inverse Transform Method')"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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YlavXl3sBGhWVhaHDx/m1FNPJSkpiZtvvpkePXqUut1CueKKK5g7dy47duwgJSWFBx54gNGjR3Peeefxwgsv0KJFCyZNmsS5555LQUEBo0aNomvXruVeXonCbayv6Fe5T7Kqqs79m3Op5LEj5Z9HDVddLpOMVFV5CZ+pGMuWLdPbb7+92PjBgwfrsmXLPIiodDXvJCvYzU7GmDJLS0srdvIU4Lvvvjt+1BBtIjvBWzu88UhqairLlwftQdtEmI0bNxIXF5mt1aWJ8AS/xds4jDGmGovQBO/2Rmx3sxpjTEiRmeDrNIaYOKvBG2NMCSIzwRfezWonWY0xJqTITPDg3M1qNXhjjAkpghO83c1qjDElidxrg+qfbHezVqDUcTMqdH45E84vtcyf//xn3nzzTWJjY4mJieGf//wn/fr148knn2TMmDHUrVu3xOnDLRfK9u3bueCCC8jLy2PixIlFbnUPnHdiYiIHDhwo13IOHTrEDTfcQHZ2NqrKSSedxMcffxzyARwVoTDezZs3c9tttzFt2rRKW5apviK3Bp94MhzeZc9mjVDz5s3jww8/ZPHixWRnZzN79mxatXIeDPbkk08W6Vs9lHDLhfLZZ5/RqVMnlixZUqwfkxOdt7+nnnqKZs2asWzZMpYvX86LL75IfHx8hcy7NC1atLDkXoNFboK3m50i2pYtW0hKSjre819SUhItWrRg4sSJbN68mbPPPpuzzz4bgJtuuomMjAy6du3KfffdBxC0XCjr169n0KBBdO/enUGDBrFhwwaysrK46667mDlzJunp6UV6HAw173vuued4N7w//uic4N++fTuXXHIJffr0oU+fPnz99ddB17Vly5+eQ9+xY8fj6x3q4RyJiYncfffd9O7dm8GDB7NgwQIGDhxI27ZtmT59OgBTpkxhxIgRDB06lI4dO/LAAw8UW7b/wzSmTJnCxRdfzNChQ2nfvn2Rro9ffPFFOnTowMCBA7nhhhsYO3ZsidvURIbITfANCq+FtxOtkWjIkCFs3LiRDh06cPPNN/PFF18AcNttt9GiRQvmzJnDnDlzAKcpJzMzk+zsbL744guys7ODlgtl7NixXHvttWRnZ3PVVVdx2223kZ6ezoMPPshll11GVlYWderUOV4+2LwPHjxI//79Wbp0KQMGDOD5558H4Le//S233347Cxcu5L333uP6668v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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "U = np.random.rand(1000000)\n",
    "beta = 1.0\n",
    "X = sample_Exponential(U, beta)\n",
    "x = np.linspace(0,6,10000)\n",
    "f = 1/beta * np.exp(-x/beta)\n",
    "plt.hist(X, bins=50,normed=True, label=\"Stat. of the Sampling\");\n",
    "plt.plot(x, f, label=r\"PDF of Exponential Distribution, $\\beta = 1.0$\")\n",
    "plt.legend()\n",
    "plt.xlabel(r\"Statistical Test of Exponential Samples by Inverse Transform Method\")\n",
    "#plt.savefig('Exp_inv.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这种方法是最直接的采样手段。Fishman1995 中给出了一些常见分布的 PDF 以及相应的逆变换表达式。从表上我们就发现并不是每一个能写出表达式的逆变换在计算上都是高效率的，而有的甚至根本没有解析形式。比如最重要的正态分布我们就没有解析的逆变换形式。不过 Hastings1955（这是一本神奇的书，给出了各种难以计算公式的有理逼近估计）给出了一个有理逼近形式：\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "  F^{-1}(y) = \\mu\n",
    "  + \\mathrm{sign}(y - \\frac{1}{2})\\sigma\\left(t\n",
    "  - \\frac{c_0 + c_1 t + c_2 t^2}{1 + d_1 t + d_2 t^2 + d_3 t^3}\\right),\n",
    "  \\label{eq::approx_normal}\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "其中\n",
    "\n",
    "$$\n",
    "t = \\sqrt{-\\ln\\left[\\min(y, 1 - y)\\right]^2},\n",
    "$$\n",
    "\n",
    "各参数值为\n",
    "\n",
    "$$\n",
    "\\begin{array}{c}\n",
    "  c_0 = 2.515517, c_1 = 0.802853, c_2 = 0.010328,\\\\\n",
    "  d_1 = 1.432788, d_2 = 0.189269, d_3 = 0.001308.\n",
    "\\end{array}\n",
    "$$\n",
    "\n",
    "此公式绝对误差小于$0.45 \\times 10^-3$。\n",
    "\n",
    "如果逆变换本身没有解析形式或者难以计算，那么另一个方法是直接从 CDF 入手计算（注意不是 PDF），当然前提是 PDF 和 CDF 可以快速计算。这本质上就是之前离散的情况的查表的极限沿拓，到了连续情形就变成对一个 $\\forall y \\in [0, 1]$，寻找 $x \\in \\mathbb{R}$，满足\n",
    "$$\n",
    "\\begin{equation}\n",
    "  F(x) = y \\Rightarrow F(x) - y = 0.\n",
    "  \\label{eq::inv_equation}\n",
    "\\end{equation}\n",
    "$$\n",
    "而上述方程，我们可以用数值方法，比如二分法，或 Newton 法求解。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 接受－拒绝方法（Accept-Rejection Method）\n",
    "\n",
    "总是有一些分布，或者写不出反函数的解析表达，或者该解析表达难以计算（或计算量很大）。比如最重要的正态分布就没有显式的积累分布函数的解析表达。而一些初等函数，如指数，对数的计算，事实上计算量是极大的。1947年，冯·诺伊曼从条件概率入手，提出了取舍算法(Accept-Rejection\n",
    "Method，简称AR法)。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Neumann 1951**\n",
    "\n",
    "令$f(z)$，$a \\leq z \\leq b$是某分布的概率密度函数且具有分解形式\n",
    "$$\n",
    "\\begin{equation}\n",
    "    f(z) = c g(z) h(z),\n",
    "    \\label{eq::AR_frac_pdf}\n",
    "  \\end{equation}\n",
    "$$\n",
    "其中\n",
    "$$\n",
    "\\begin{equation}\n",
    "    h(z) \\geq 0, \\int_a^b h(z) dz = 1, c = \\sup_{z}\\left[\\frac{f(z)}{h(z)}\\right],\n",
    "    \\label{eq::AR_pfd_hc}\n",
    "  \\end{equation}\n",
    "$$\n",
    "并且\n",
    "$$\n",
    "\\begin{equation}\n",
    "    0 \\leq g(z) \\leq 1.\n",
    "    \\label{eq::AR_pdf_g}\n",
    "  \\end{equation}\n",
    "$$\n",
    "令 $Z$ 是 PDF 为 $h(z)$ 的随机变量，$U$ 为服从 $U(0, 1)$ 的随机变量。则满足 $U \\leq g(Z)$ 的随机变量 $Z$ 服从PDF为 $f(z)$ 的概率分布。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**证明：** 随机变量 $U$ 的 PDF 为 $1$，$u \\in [0, 1]$；而 $Z$ 的 PDF 为 $h(z)$，$z \\in [a, b]$，故二者联合分布，即随机向量$(U, Z)$ 的 PDF 为\n",
    "$$\n",
    "  \\begin{equation}\n",
    "    f_{U, Z}(u, z) = h(z).\n",
    "  \\end{equation}\n",
    "$$\n",
    "（不严格地，可看作任取 $[0, 1] \\times [a, b]$ 中的一点，事件恰好落在这一点的概率。把点想像成一个点微元。）现在考虑 $Z$ 的条件概率分布\n",
    "$$\n",
    "  \\begin{equation}\n",
    "    h_Z(z\\left|U \\leq g(Z)\\right.) =\n",
    "    \\frac{\\int_0^{g(z)}f_{U, Z}(u, z)du}{P(U \\leq g(Z))}.\n",
    "    \\label{eq::AR_cond_h}\n",
    "  \\end{equation}\n",
    "$$\n",
    "（这个事件说的是，首先 $Z$ 是一个随机变量，它按 $h(Z)$ 的概率分布发生。然后 $U$ 是一个 $U(0, 1)$ 分布的随机变量。两件事情同时发生的概率，可以认为是先有 $h(Z)$ 的概率 $Z$ 落在了 $z$ 点，我们还是把它想像成一个微元事件，同时 $U$ 落在 $[0, g(z)]$ 区间上，可以是其中任何一点，所以要积分。这两件事情的全概率是上式的分子。现在我们求的条件概率是，如果 $U$ 和 $Z$ 各自都是独立的，$U$ 在投点的时候并不知道 $Z$ 在哪里，以及 $g(Z)$ 是多少，但我们还是想问这种情况下，$U \\leq g(Z)$ 的这个事件，关于 $Z$ 的概率密度分布是多少？那么这个就是条件概率分布，它要除以 $U \\leq g(Z)$ 的概率。）\n",
    "  \n",
    "再由（因为 $f(z)$ 是 PDF）\n",
    "$$\n",
    "  \\begin{equation}\n",
    "    c = \\frac{1}{\\int_{a}^b g(z) h(z)dz},\n",
    "    \\label{eq::AR_dri_c}\n",
    "  \\end{equation}\n",
    "$$\n",
    "以及\n",
    "$$\n",
    "\\begin{equation}\n",
    "    \\int_0^{g(z)}f_{U, Z}(u, z)dx = \\int_0^{g(z)} h(z) du = g(z) h(z),\n",
    "    \\label{eq::AR_cond_f}\n",
    "  \\end{equation}\n",
    "$$\n",
    "和\n",
    "$$\n",
    "\\begin{equation}\n",
    "    P(U \\leq g(Z)) = \\int_{a}^b h (z) g(z) dz = \\frac{1}{c},\n",
    "    \\label{eq::AR_conf_f_bottom}\n",
    "  \\end{equation}\n",
    "$$\n",
    "（$Z$ 落在 $z \\in [a, b]$ 点的概率是 $h(z)$，然后此时 $U < g(Z)$ 的概率就是 $g(z)$，故 $Z$ 落在 $z$ 点，同时 $U < g(Z)$ 的单点微元概率是 $h(z)g(z)$，对 $Z$ 取遍全部可能性积分，就得到全部可能的概率。注意和上面分子的不同。分子求的是一个边际分布，是一个关于 $Z$ 的概率密度分布，而分母是一个概率，是一个数。在条件概率公式下，构成了所求的条件概率密度分布函数。）\n",
    "\n",
    "最终有\n",
    "$$\n",
    "\\begin{equation}\n",
    "    h_Z(z\\left|U \\leq g(Z)\\right.) = c g(z) h(z) = f(z).\n",
    "    \\label{eq::dri_f}\n",
    "  \\end{equation}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据定理结果，如果我们已知 $g(z)$ 和 $h(z)$，则可以构建算法产生服从分布\n",
    "$f(z)$ 的随机变量。基本步骤为：\n",
    "1. 产生服从分布 $h(z)$ 的随机变量 $Z$；\n",
    "2. 产生服从 $U(0, 1)$ 的随机变量 $U$；\n",
    "3. 计算 $g(Z)$；\n",
    "4. 若 $U \\leq g(Z)$，返回 $Z$，否则放弃，返回第1步."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**标准半正态分布（half-normal distribution）** 的PDF为：\n",
    "$$\n",
    "  \\begin{equation}\n",
    "    f(z) = \\sqrt{\\frac{2}{\\pi}} e^{\\frac{-z^2}{2}}, 0 \\leq z < \\infty.\n",
    "    \\label{eq::def_half_normal}\n",
    "  \\end{equation}\n",
    "$$\n",
    "我们可以将其写作\n",
    "$$\n",
    "\\begin{equation}\n",
    "    f(z) = \\sqrt{\\frac{2e}{\\pi}} e^{\\frac{-(z - 1)^2}{2}}e^{-z},\n",
    "    \\label{eq::frac_half_normal}\n",
    "  \\end{equation}\n",
    "$$\n",
    "并令\n",
    "$$\n",
    "\\begin{equation}\n",
    "\\begin{array}{rcl}\n",
    "    h(z) &=& e^{-z}, \\\\\n",
    "    g(x) &=& e^{\\frac{-(z - 1)^2}{2}},\n",
    "\\end{array}\n",
    "  \\end{equation}\n",
    "$$\n",
    "以及\n",
    "$$\n",
    "\\begin{equation}\n",
    "    c = \\sqrt{\\frac{2e}{\\pi}} \\approx 1.3155.\n",
    "    \\label{eq::half_normal_c}\n",
    "  \\end{equation}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面是用AR方法抽取标准半正态分布的过程。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sample_half_normal(N):\n",
    "# N, 实际采样数\n",
    "    k = 0  # 实际接受总数\n",
    "    U = np.random.rand(N)  # 产生均匀分布\n",
    "    X = [-np.log(u) for u in U]  # 产生服从h的随机变量X, 实际上是beta(1)\n",
    "    G = [np.exp(-(x-1)**2/2) for x in X]   # 计算g(X)\n",
    "    U = np.random.rand(N)  # 再次产生均匀分布\n",
    "    for i in range(N):\n",
    "        if U[i] <= G[i]:  # 在g发生的条件下接受\n",
    "            X[k] = X[i]   # 将采样记下来\n",
    "            k = k + 1\n",
    "    return k, X"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "实际产生100万个服从标准半正态分布的随机数。然后做统计检测并和PDF对比。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "N = 1000000\n",
    "k, X = sample_half_normal(N)\n",
    "1000000/k\n",
    "x = np.linspace(0,6,10000)\n",
    "plt.hist(X[0:k], bins=50, normed=True, label=r\"Stat\");\n",
    "plt.plot(x,np.sqrt(2/np.pi)*np.exp(-x**2/2), label=r\"PDF\")\n",
    "plt.legend()\n",
    "plt.xlabel(r\"Half Normal Distribution Samples Produced by AR Method\")\n",
    "plt.savefig('half_normal.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "结果匹配一致。然后下面将其改造为标准正态分布。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(k):\n",
    "    w = np.random.rand()\n",
    "    if w > 0.5:\n",
    "        X[i] = -X[i]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7fecb8500400>]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-6,6,10000)\n",
    "plt.hist(X[0:k], bins=50, normed=True, label=\"Stat. of the Sampling\");\n",
    "plt.plot(x,1/np.sqrt(2*np.pi)*np.exp(-x**2/2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为防止重复抽取，应该直接在AR抽取中直接产生标准正态分布更好。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sample_normal(N):\n",
    "# N, 实际采样数\n",
    "    k = 0  # 实际接受总数\n",
    "    U = np.random.rand(N)  # 产生均匀分布\n",
    "    X = [-np.log(u) for u in U]  # 产生服从h的随机变量X\n",
    "    G = [np.exp(-(x-1)**2/2) for x in X]   # 计算g(X)\n",
    "    U = np.random.rand(N)  # 再次产生均匀分布\n",
    "    for i in range(N):\n",
    "        if U[i] <= G[i]:  # 在g发生的条件下接受\n",
    "            w = np.random.rand()\n",
    "            if w <= 0.5:\n",
    "                X[k] = X[i]\n",
    "            else:\n",
    "                X[k] = -X[i]\n",
    "            k = k + 1\n",
    "    return k, X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "N = 1000000\n",
    "k, X = sample_normal(N)\n",
    "N/k\n",
    "x = np.linspace(-6,6,10000)\n",
    "plt.hist(X[0:k], bins=50,normed=True, label=\"Stat\");\n",
    "plt.plot(x,1/np.sqrt(2*np.pi)*np.exp(-x**2/2), label=r\"PDF\")\n",
    "plt.legend()\n",
    "plt.xlabel(r\"Normal Distribution Samples Produced by AR Method\")\n",
    "plt.savefig('normal.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "注意这个统计图本身是不对称的，因为有概率涨落。但是进一步加细可以看到，其“极限”和目标PDF匹配的很好。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7fecbc5a6240>]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.hist(X[0:k], bins=100,normed=True, label=\"Stat\");\n",
    "plt.plot(x,1/np.sqrt(2*np.pi)*np.exp(-x**2/2), label=r\"PDF\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在回到半正态分布的例子。我们可以画出接受和拒绝区域。而常数$c$就是接受区域的面积（总面积是１）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(0,1,10000)\n",
    "z = -np.log(x)\n",
    "u = np.exp(-(z - 1)**2 / 2)\n",
    "plt.plot(x,u,label=r'$g(-\\log(x))$')\n",
    "plt.xlim(0.0, 1.0)\n",
    "plt.ylim(0.0, 1.0)\n",
    "#plt.axis(\"equal\")\n",
    "axs = plt.gca()\n",
    "axs.set_aspect('equal', 'box')\n",
    "plt.text(0.65, 0.9, r'reject',fontsize=\"12\")\n",
    "plt.text(0.05, 0.9, r'reject',fontsize=\"12\")\n",
    "plt.text(0.5, 0.5, r'accept',fontsize=\"12\")\n",
    "plt.legend(fontsize=\"12\")\n",
    "plt.xlabel(r\"x\",fontsize=\"12\")\n",
    "plt.ylabel(r\"u\",fontsize=\"12\")\n",
    "plt.savefig('AR_region.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果我们有办法快速产生指数分布，比如我们直接调用Python提供的指数分布生成函数，那么下面的版本有可能比原始版本代价更低。当然这里速度的变化主要是Python提供的指数分布生成程序实在太快了。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sample_half_normal_v2(N):\n",
    "# N, 实际采样数\n",
    "    k = 0  # 实际接受总数\n",
    "    X = stats.expon.rvs(size=N)  \n",
    "    G = stats.expon.rvs(size=N)  # 产生两个独立的beta(1)\n",
    "    for i in range(N):\n",
    "        if (X[i] - 1)**2/2 <= G[i]:  # 等价于在g的条件下接受\n",
    "            X[k] = X[i]   # 将采样记下来\n",
    "            k = k + 1\n",
    "    return k, X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5,0,'Half Normal Distribution Samples Produced by AR Method')"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEKCAYAAADpfBXhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xt8FOXZ//HPlYSDHESFaBHQoIKKRQUCrVUsigewKtZDEQ+VVks9V22fFqv11J9PrdpqrfRRtJ6LiFgrRZCDAqKiEhRBQAQRJaIlUgFRINnd6/fHDLiEJVnCJpPd/b5fr31lZ+be2e/sJldm7525x9wdERHJLQVRBxARkcxTcRcRyUEq7iIiOUjFXUQkB6m4i4jkIBV3EZEcpOIuIpKDVNxFRHKQiruISA4qiuqJ27Vr5yUlJVE9vYhIVpozZ87n7l5cW7vIintJSQllZWVRPb2ISFYys4/SaaduGRGRHKTiLiKSg1TcRURyUGR97iIiO6uqqory8nI2btwYdZSMa968OR07dqRJkyZ1eryKu4hkrfLyclq3bk1JSQlmFnWcjHF3Vq9eTXl5OZ07d67TOtLqljGzAWa22MyWmtnwFMv3MbNpZva2mc0zs5PqlEZEZAds3LiRtm3b5lRhBzAz2rZtu1OfSGot7mZWCIwABgLdgCFm1q1as+uBMe7eAzgb+FudE4mI7IBcK+yb7ex2pbPn3gdY6u7L3L0SGA0MqtbGgV3D+22AlTuVqiZVGyG2qd5WLyKSC9Lpc+8ArEiaLge+U63NTcBkM7sCaAkcl2pFZjYMGAawzz777GjWwOwHYPL1ULQL7L4v7N0DuhwPXU6EZq3qtk4RkToqLCyke/fuxGIxDj74YB599FFatGixZX5VVRVFRUVccMEFXHXVVRQUFDB9+nQGDRq0pT+9Xbt2TJ06NaO50tlzT/XZoPpVtYcAj7h7R+Ak4HEz22bd7j7S3UvdvbS4uNazZ1Pb5wjuqPoRIzcey5TPWvD53Odh7E/hTwfCpOvgy8/qtl4RkTrYZZddmDt3Lu+++y5Nmzblvvvu22r+ggULmDJlChMmTODmm2/e8ri+ffsyd+5c5s6dm/HCDuntuZcDnZKmO7Jtt8uFwAAAd59lZs2BdsCqTITcSsdSRsT/s2WygAS9bTFPdX8PXv8blD0M/YbDdy+BwrodQiQiUhd9+/Zl3rx528zfc889GTlyJL179+amm25qkCzpFPfZQBcz6wx8QvCF6TnV2nwM9AceMbODgeZARSaDbk+CAt7wgymZfTD72hH8ruhxjpvyO+ZOepjDr34Wdi9piBgiErWJw+Gz+Zld57e6w8Db0moai8WYOHEiAwYMSLl8v/32I5FIsGpVsM87c+ZMDj/8cADOOussrrvuusxkDtVa3N09ZmaXA5OAQuAhd19gZrcAZe4+Dvgl8ICZXU3QZTPU3at33dS7j/xbXFT1PwyMv8EfmzwA9x8NZ/w96JMXEakHGzZs2FKk+/bty4UXXrjdtsllsW/fvowfP77ecqV1EpO7TwAmVJt3Q9L9hcCRmY1WdxMT3+HdyhJmtn8IRg2GU/8KPc6NOpaI1Kc097AzbXPfem2WLVtGYWEhe+65J4sWLar3XDk7tswK3wt+MhE694XnLoXX/y/qSCKSpyoqKrj44ou5/PLLG+y4/NwefqBZazjnaXjmp/DCcGiyC/QaGnUqEckDm7trNh8Kef7553PNNdc02PPndHEvGf48AE04i5FNPub7466ioGkr6H5mxMlEJFesX78+5fx4PL7dx/Tr149+/frVU6JAznbLJKuiiIurrma2Hwj/uhTKdQUoEclteVHcATbRlIsrr4Jd28OTQ2BtedSRRETqTd4Ud4Av2BWGPAWxjTD6HI1RIyI5K6+KOwB7HgQ/vA8+fQem3FB7exGRLJR3xb1k+POUPAIPxQbAG/fBovo7iUBEJCp5V9w3uy02hPmJEnjuMlj3adRxREQyKqcPhaxJJU24ouoKpseug/FXwZDRkKOD/ovki82HP2fK8tt+UGubW2+9lVGjRlFYWEhBQQH3338/s2bNYtiwYbRo0aLGx959991ptauLvN1zB1ju7aH/DfD+CzDvqajjiEiWmTVrFuPHj+ett95i3rx5TJ06lU6dOnH33Xfz9ddf1/r4dNvVRV4Xd4D9ntuHskRX1v7zanoPfyLj//lFJHd9+umntGvXjmbNmgHBRTfGjh3LypUrOeaYYzjmmGMAuOSSSygtLeWQQw7hxhtvBOCee+7Zpl0m5X1xT1DAr6uG0YwqbmryaNRxRCSLnHDCCaxYsYKuXbty6aWXMmPGDK688kr23ntvpk2bxrRp04Cg66asrIx58+YxY8YM5s2bl7JdJuV9cQdY5nszIjaIHxS+Sd+CbQfaFxFJpVWrVsyZM4eRI0dSXFzM4MGDeeSRR7ZpN2bMGHr27EmPHj1YsGABCxcurPdsefuFanUj4ydzeuFMbip6FGLXQFGzqCOJSBYoLCzcMlZM9+7defTRrXsAPvzwQ+68805mz57N7rvvztChQ9m4cWO959Kee2gTTbkpNpT9Cz6FWfdGHUdEssDixYtZsmTJlum5c+ey77770rp1a7788ksA1q1bR8uWLWnTpg3/+c9/mDhx4pb2ye0yLa09dzMbAPyF4EpMD7r7bdWW3wVs/kagBbCnu++WyaANYUbiMF6I92bAjDvg0MHQpmPUkURkB6Rz6GImrV+/niuuuII1a9ZQVFTEAQccwMiRI3nyyScZOHAg7du3Z9q0afTo0YNDDjmE/fbbjyOP/Oa6RsOGDduqXSZZbVfDM7NC4H3geIKLZc8GhoRXX0rV/gqgh7v/tKb1lpaWellZ3UZnrM8jWjpQwastfw3fPj0YpkBEGq1FixZx8MEHRx2j3qTaPjOb4+6ltT02nW6ZPsBSd1/m7pXAaGBQDe2HAE+msd5G6ROK4bsXwzuj4VN9uSoi2Smd4t4BWJE0XR7O24aZ7Qt0Bl7a+WgROuoa2GV3mHw9NPx1vkVEdlo6xT3VOfnbq3hnA2PdPeUlSMxsmJmVmVlZRUVFuhkb3i67wfd/DR/OgKVTo04jIjWorWs5W+3sdqVT3MuBTknTHYGV22l7NjV0ybj7SHcvdffS4uLi9FM2sJLhz9PlX3uzPLEX7z1+NfsN/3fUkUQkhebNm7N69eqcK/DuzurVq2nevHmd15HO0TKzgS5m1hn4hKCAn1O9kZkdCOwOzKpzmkakiiJujw3mb03v4ZSC14BToo4kItV07NiR8vJyGnVPQB01b96cjh3rfsRercXd3WNmdjkwieBQyIfcfYGZ3QKUufu4sOkQYLTn0L/QiYk+LErswy+K/gnx30OhzvkSaUyaNGlC586do47RKKVVrdx9AjCh2rwbqk3flLlYjYNTwJ9jZ/JA0z8Ho0b2ODfqSCIiadEZqrWYkujFvERnmPFHiFdFHUdEJC0q7rUy/hw7E9Z8BHP/EXUYEZG0qLinYXricOhQCjPugNimqOOIiNRKxT0tBsf8FtaVwztZe/KtiOQRFfd07X8s7N0DXrkb4rGo04iI1EjFPU0l107g58v7wRcfcsXvbtTl+ESkUVNx3wGTE71YkujApUXj2P4IDCIi0VNx3wFOAf8XO4WDCz7mmIK5UccREdkuFfcdNC7xPcq9HZcX/UsjRopIo6XivoNiFHF/7GR6FSyBj16NOo6ISEoq7nUwJt6PCt8VXrkr6igiIimpuNfBJpryaOzEYKz3VYuijiMisg0V9zr6R7w/FDWH1/8WdRQRkW2ouNfRF+wKhw2Bd56C9bk3lrSIZDcV951xxGUQ3wSzH4w6iYjIVlTcd0LJne8zNd6Dz6f/jQOHPxt1HBGRLVTcd9Lf4yfRztZxWqEOixSRxiOt4m5mA8xssZktNbPh22nzIzNbaGYLzGxUZmM2XrMS3Xg3UcJFhRN0UpOINBq1FnczKwRGAAOBbsAQM+tWrU0X4FrgSHc/BLiqHrI2UsaDsZPoUvAJLH0x6jAiIkB6e+59gKXuvszdK4HRwKBqbX4GjHD3LwDcfVVmYzZuzye+y2e+O8y6N+ooIiJAesW9A7Aiabo8nJesK9DVzF41s9fNbECmAmaDKop4PHY8LJsGFe9HHUdEJK3ibinmVe9cLgK6AP2AIcCDZrbbNisyG2ZmZWZWVlGRW8eGj44fA4VNYfYDUUcREUmruJcDnZKmOwIrU7R5zt2r3P1DYDFBsd+Ku49091J3Ly0uLq5r5kZpNW3gkNNh7ijYuC7qOCKS59Ip7rOBLmbW2cyaAmcD46q1+RdwDICZtSPoplmWyaBZoc8wqFwP74yOOomI5Llai7u7x4DLgUnAImCMuy8ws1vM7NSw2SRgtZktBKYB/+Puq+srdKPVsRd06AVvjoREIuo0IpLHitJp5O4TgAnV5t2QdN+Ba8Jbfuvzc3h2GHw4PbiotohIBHSGaqYdchq0LIY3RkadRETymIp7BpUMf56S66dyz9ojSSx+gaOufTjqSCKSp1Tc68GoWH8SGOcXTok6iojkKRX3evAZbXkh0ZvBhdOh8uuo44hIHlJxryePxU5gN/sK5o+JOoqI5CEV93ryph/EokQnmP13jRYpIg1Oxb3eGP+IHwefzYNP3oo6jIjkGRX3evSv+JHQpCWU/T3qKCKSZ1Tc69F6WsChP4J3n4ENX0QdR0TyiIp7fSv9KcQ2wtwno04iInlExb2+tT8UOvaGsof0xaqINBgV94ZQ+lNYvQSWz4w6iYjkCRX3elYy/HkOHL0La7wl4x+6lZLhz0cdSUTygIp7A9hEU8bGj+bEgtkUsybqOCKSB1TcG8ioeH+aWJyzCqdHHUVE8oCKewNZ5nvzavwQzil6CRLxqOOISI5TcW9AT8SPo6N9DkunRh1FRHJcWsXdzAaY2WIzW2pmw1MsH2pmFWY2N7xdlPmo2W9KoherfLdgvBkRkXpUa3E3s0JgBDAQ6AYMMbNuKZo+5e6Hh7cHM5wzJ8QoYnS8HyyZDGs+jjqOiOSwdPbc+wBL3X2Zu1cCo4FB9Rsrd42OHQtmMOeRqKOISA5Lp7h3AFYkTZeH86o7w8zmmdlYM+uUkXQ5aCXtoMuJ8NbjEKuMOo6I5Kh0irulmFf9PPp/AyXufigwFXg05YrMhplZmZmVVVRU7FjSXFL6U/hqFbw3PuokIpKj0inu5UDynnhHYGVyA3df7e6bwskHgF6pVuTuI9291N1Li4uL65I3J+z30CZWJIqZ9dQdwUW1ddaqiGRYOsV9NtDFzDqbWVPgbGBccgMza580eSqwKHMRc0+CAp6MH8sRhQvZ3z6JOo6I5KBai7u7x4DLgUkERXuMuy8ws1vM7NSw2ZVmtsDM3gGuBIbWV+BcMSbej0ov5NzCF6OOIiI5qCidRu4+AZhQbd4NSfevBa7NbLTc9jltmJTozRmFL3N7bHDUcUQkx+gM1Qg9ETueNvY1pxTOijqKiOQYFfcIveEHsSTRQV0zIpJxKu6RMv4R78/hBR/AyrlRhxGRHKLiHrF/xvuywZsGl+ETEckQFfeIraMl4+Lfg/lPw8a1UccRkRyh4t4IPBE/Dqq+hnljoo4iIjlCxb0RmO/7QfvDg6GAvfrIDiIiO07FvbHofSFULIKPX486iYjkABX3xuLbZ0CzNlCmC3mIyM5TcW8kSm6YzsNffZdN856l5/Ano44jIllOxb0RGRXvTzOLcVbhjKijiEiWU3FvRJZ4R95IHMQ5hS9CIhF1HBHJYirujcw/Ysexb8EqWPZS1FFEJIupuDcyLyR687nvCrN1xqqI1J2KeyNTSROejn8f3p8Ia3UhDxGpGxX3RmhU/NjgZKa3Ul6KVkSkVirujdAK3wsO6A9zHoV4VdRxRCQLpVXczWyAmS02s6VmNryGdmeamZtZaeYi5qnSC2H9Z7B4YtRJRCQL1VrczawQGAEMBLoBQ8ysW4p2rQmun/pGpkPmpa4nwq4dNRSwiNRJOnvufYCl7r7M3SuB0cCgFO1+D9wObMxgvvxVUAi9LoBl02D1B1GnEZEsk05x7wCsSJouD+dtYWY9gE7uPj6D2aTnj8EKtfcuIjssneJuKeZtGZfWzAqAu4Bf1rois2FmVmZmZRUVFemnzEMlw5+n5NY5TIj14ovXHuHA4c9GHUlEskg6xb0c6JQ03RFYmTTdGvg2MN3MlgPfBcal+lLV3Ue6e6m7lxYXF9c9dR55In4cu9t6TirQVxkikr50ivtsoIuZdTazpsDZwLjNC919rbu3c/cSdy8BXgdOdfeyekmcZ2YlurEs8S3OK5oadRQRySK1Fnd3jwGXA5OARcAYd19gZreY2an1HTDfOQU8ET+eXgVLYOXbUccRkSyR1nHu7j7B3bu6+/7ufms47wZ3H5eibT/ttWfW0/Hv85U3gzdGRh1FRLKEzlDNAl/SgmfiR8O7Y2G9vogWkdqpuGeJR+MnQLwS5jwSdRQRyQIq7lniA+8A+x8bXGNV482ISC1U3LPJdy6GLz+FRdt81SEishUV92xywPGwe2d44/6ok4hII6finkVKfjuRW1YdBSve4ORr/0rJ8OejjiQijZSKe5bZfFjk0KLJUUcRkUZMxT3LfEkLxsaP5pSC12jL2qjjiEgjpeKehR6Ln0AzizGk8KWoo4hII6XinoU+8A7MiB8ajDejwyJFJAUV9yz1cPxEvmVfwIJ/RR1FRBohFfcsNSNxGB8k2sOsv4J77Q8Qkbyi4p6lnAIeiP8APn0Hlr8SdRwRaWRU3LPYs/GjoGUxvPbXqKOISCOj4p7FNtEUev8MlkyCisVRxxGRRkTFPdv1vgiKmsOse6NOIiKNiIp7tmvZFg4/F94ZDV/+J+o0ItJIpFXczWyAmS02s6VmNjzF8ovNbL6ZzTWzV8ysW+ajSiolw5+n36vdSMSquOePv9Z4MyICpFHczawQGAEMBLoBQ1IU71Hu3t3dDwduB/6c8aSyXcu9PVMSvTi/cCrN2RR1HBFpBNLZc+8DLHX3Ze5eCYwGBiU3cPd1SZMtAR143cBGxn7A7raeMwtfjjqKiDQC6RT3DsCKpOnycN5WzOwyM/uAYM/9yszEk3TN8a68nTiAiwonQDwWdRwRiVg6xd1SzNtmz9zdR7j7/sBvgOtTrshsmJmVmVlZRYUu9JxZxn2xUygp+A8s1JAEIvkuneJeDnRKmu4IrKyh/WjgtFQL3H2ku5e6e2lxcXH6KSUtkxO9eD/RAWb+CRKJqOOISITSKe6zgS5m1tnMmgJnA1tdxNPMuiRN/gBYkrmIki6ngL/FBsGqhfD+xKjjiEiEai3u7h4DLgcmAYuAMe6+wMxuMbNTw2aXm9kCM5sLXANcUG+JpUb/ThwBu+0b7L1rQDGRvFWUTiN3nwBMqDbvhqT7v8hwLqmjOIVw1FUw/mpYNh32PybqSCISAZ2hmosOPxdatw/23kUkL6m456CS66fy+//2h+UzOf3au6KOIyIRUHHPUaPix/Jfb8VlRc9FHUVEIqDinqM20JyHYgPpX/g2rHw76jgi0sBU3HPYo/ETWeMtYdofoo4iIg1MxT2HfUkLRsZODi7msWJ21HFEpAGpuOe4R+InQou2MO3WqKOISANScc9xX9McjrwKlk2Dj16LOo6INBAV93zQ+yJotRe8dKvOWhXJEyru+aBpCzjqGvjoFfhwRtRpRKQBqLjngZLhz3Pgv/Zipe/BnEd+Rcnw8VFHEpF6puKeJzbRlHtjP6RXwRKOL5gTdRwRqWcq7nlkTPz7fJBoz2+KRutqTSI5TsU9j8Qo4o+xszmgYCW8/XjUcUSkHqm455nJiVJmJ7rC9D/ApvVRxxGReqLinneMP1SdA+v/A7NGRB1GROqJinseesu7wsGnwqt/gfWroo4jIvUgreJuZgPMbLGZLTWz4SmWX2NmC81snpm9aGb7Zj6qZFT/GyG+Cab9b9RJRKQe1FrczawQGAEMBLoBQ8ysW7VmbwOl7n4oMBa4PdNBJbNK7lzMw5X9iZc9wknXjqBk+PNRRxKRDEpnz70PsNTdl7l7JTAaGJTcwN2nufvX4eTrQMfMxpT6cFfsDNbQihubPAZoWAKRXJJOce8ArEiaLg/nbc+FwMSdCSUNYx2tuCM2mO8UvMepBRpUTCSXpFPcLcW8lLt5ZnYeUArcsZ3lw8yszMzKKioq0k8p9WZMvB/zEp35bZNROjRSJIekU9zLgU5J0x2BldUbmdlxwHXAqe6+KdWK3H2ku5e6e2lxcXFd8kqGJSjgpqoL+JZ9ATPvjDqOiGRIOsV9NtDFzDqbWVPgbGBccgMz6wHcT1DYdWxdlnnLu/JMvC+8di98vjTqOCKSAbUWd3ePAZcDk4BFwBh3X2Bmt5jZqWGzO4BWwNNmNtfMxm1nddJI3VY1BJq0gPFXacx3kRxQlE4jd58ATKg274ak+8dlOJc0sAp2g+NvDor7209Az/OjjiQiOyGt4i75ofPYdoxuehAHPvcbjhtTyOe0YfltP4g6lojUgYYfkC2cAn5bdSG7sIkbmjwWdRwR2Qkq7rKVD7wDI2KncWrhLPoVvB11HBGpIxV32cb/xU/l/UQH/tDk77Dhi6jjiEgdqLjLNqoo4pdVl1DMGpj4m6jjiEgdqLhLSvN9P/4a+yHMewoW/CvqOCKyg1TcZbtGxAfB3j1h/NXw5WdRxxGRHaDiLtsVo4j+Hw5h49df8tLtgykZPj7qSCKSJhV3qdEH3oE/xM7h2MK5/KTwhajjiEiaVNylVo/GT2BKvBfXFo2CT+ZEHUdE0qDiLmkwflX1c1axOzw9FDasiTqQiNRCxV3SspZWXFF5BaxbCc9dpsHFRBo5FXdJ29veBY67Gd4bD6/9Neo4IlIDFXfZMUdcBt0GwdQbYcnUqNOIyHaouMsOKbl2Age/NYiF8U6se+J8jr32gagjiUgKKu6ywzbQnJ9VXkMlRTzQ5E/6glWkEVJxlzr5hGIuqbyKfWwVPH0BxCqjjiQiSdIq7mY2wMwWm9lSMxueYvnRZvaWmcXM7MzMx5TGaLYfxPCqn8Gy6fDcpZBIRB1JREK1FnczKwRGAAOBbsAQM+tWrdnHwFBgVKYDSuP2TOJo6H8jzH8apvwu6jgiEkrnMnt9gKXuvgzAzEYDg4CFmxu4+/JwmXbd8tFR4cBis+6F1t+C710RdSKRvJdOt0wHYEXSdHk4TwQIjqDZ7+W+jI9/FyZfz++u+0XUkUTyXjrF3VLMq9PpiWY2zMzKzKysoqKiLquQRipBAVdXXcrkeC9+3+QRmP1g1JFE8lo6xb0c6JQ03RFYWZcnc/eR7l7q7qXFxcV1WYU0YlUUcVnVL5gS7wnP/xLKHoo6kkjeSqe4zwa6mFlnM2sKnA2Mq99Ykq02F3i6nBhc5OPVe6KOJJKXai3u7h4DLgcmAYuAMe6+wMxuMbNTAcyst5mVA2cB95vZgvoMLY1bJU3oOv8cxse/A1N+x33Xn6cLfYg0sHSOlsHdJwATqs27Ien+bILuGhEgKPBXVl3BF96ai4v+zR6sg/iJUNgk6mgieUFnqEq9SVDA72I/4e7Y6fyoaAY8cTp8/d+oY4nkBRV3qWfG3bEzuabyYvj4dXjgGFi1KOpQIjlPxV0axD8TR8PQCVC1AR48DhY+F3UkkZym4i4NpmTEKr7z+e+Yu3EvGPNjnrj+9KDYi0jGqbhLg/oPe3BW5Y3cFzuZ84pehAeOVTeNSD1QcZcGV0URt8XO4ceVv4H1q+D+o+HlOyBeFXU0kZyh4i6ReTlxGL3++3vGV/aEl/4fC2/uBSvfjjqWSE5QcZdIraYNl1ddybDKq2lra4Numn9fBV99HnU0kaym4i6NwuREb47fdDv0GQZvPQb39ITX7oXYpqijiWQlFXdpNNbRipIZR9N/421M/7oEJl/HJ78/OBiATJfxE9khKu7S6HzgHRha9RvOq7yWz3yPYACye3rAmw9A5VdRxxPJCiru0mi9kujOGZU3cX7lcOas2QUm/Io1t3bhvuvPhTUfRx1PpFFLa+AwkegYMxOHMrOyO73sfX5SNImLCifAXyZAlxPgsLOh60Bo0jzqoCKNioq7ZAljjh/InKoDac9qziuawumLX6H9+y+w1lswPn4E5/70Stj3SI08KYKKu2ShT2nLHbGz+VPsR3yvYAGnF87kh4WvwGMvQvM2wR79gSfB/sfALrtHHVckEirukrUSFPBKojuvJLpzHRvpWzCf42Nz6D9vInvMfxowaH8olPSFzkfDPt8Nir9IHlBxl5ywgeZMTvRmcqI3BbEEPe19jixYwBGfLKTHyvtoNuveoGHbLrB3D+jQE/buCXseDM13jTa8SD1Iq7ib2QDgL0Ah8KC731ZteTPgMaAXsBoY7O7LMxtVJD0JCijzgyiLH8Rf4mfQjEp6FbxPT1vCYauWcejnk9lr/phvHtB6byg+MLi16wp77Ae77QO7dtAXtZK1ai3uZlYIjACOB8qB2WY2zt0XJjW7EPjC3Q8ws7OBPwKD6yOwyI7aRFNeS3yb1/g2xIN5e/IFhxYso6uVs/+aTzhg7Ucc8MFrtLRqZ8S22gvadILdOgX3W7aDlsVJt3bQoi00bQ0FOrJYGo909tz7AEvdfRmAmY0GBgHJxX0QcFN4fyxwr5mZu3sGs4pkzCp2Z2qiF1PptaXgGwna8186WQUdrIIO9jkd1nxOh7Wfs/eK1ym2texqX29njQbNWoe3XYOfzcOfTVtBUfPgU0BR0q36dFEzKCiEgqKkWyEUNKk2XbT1zSyMYGAFQRazb36mmkc43+ybx0tOSae4dwBWJE2XA9/ZXht3j5nZWqAtoNGfJGs4BaykHSu9HfjBKds0pYq2rKOtraWdraMt69jdvqS1baB17Gtaf/U1rWwDrfmKVvY5rdlAS9tIM6poTiW7WGMeRiGp4Cf/E9ipVe7M43P4uQf8AXr+eOeeoxbpFPdUKavvkafTBjMbBgwLJ9eb2eI0nj+VduTOPw5tS+NT43YsacAgGZAr7wnk0rZcd0E7uKCu27JvOo3SKe7lQKek6Y7Ayu20KTezIqANsM1l7t19JDAynWA1MbMydy/d2fU0BtqWxidXtgO0LY14sZxsAAAMq0lEQVRVQ2xLOt8AzQa6mFlnM2sKnA2Mq9ZmHHBBeP9M4CX1t4uIRKfWPfewD/1yYBLBoZAPufsCM7sFKHP3ccDfgcfNbCnBHvvZ9RlaRERqltZx7u4+AZhQbd4NSfc3AmdlNlqNdrprpxHRtjQ+ubIdoG1prOp9W0y9JyIiuUdnXYiI5KCsK+5mNsDMFpvZUjMbHnWeujKzh8xslZm9G3WWnWFmncxsmpktMrMFZvaLqDPVlZk1N7M3zeydcFtujjrTzjKzQjN728zGR51lZ5jZcjObb2Zzzaws6jx1ZWa7mdlYM3sv/Js5ot6eK5u6ZcKhEN4naSgEYEi1oRCygpkdDawHHnP3b0edp67MrD3Q3t3fMrPWwBzgtCx9Twxo6e7rzawJ8ArwC3d/PeJodWZm1wClwK7ufnLUeerKzJYDpe6e1ce5m9mjwEx3fzA8+rCFu6+pj+fKtj33LUMhuHslsHkohKzj7i+T4lyAbOPun7r7W+H9L4FFBGcsZx0PrA8nm4S37Nn7qcbMOgI/AB6MOouAme0KHE1wdCHuXllfhR2yr7inGgohKwtJLjKzEqAH8Ea0Seou7MaYC6wCprh71m4LcDfwayARdZAMcGCymc0Jz3TPRvsBFcDDYVfZg2bWsr6eLNuKe1rDHEjDM7NWwDPAVe6+Luo8deXucXc/nOBM7D5mlpVdZmZ2MrDK3edEnSVDjnT3nsBA4LKwWzPbFAE9gf9z9x7AV0C9fW+YbcU9naEQpIGF/dPPAP9w939GnScTwo/L04EBEUepqyOBU8O+6tHAsWb2RLSR6s7dV4Y/VwHPEnTRZptyoDzp0+BYgmJfL7KtuKczFII0oPBLyL8Di9z9z1Hn2RlmVmxmu4X3dwGOA96LNlXduPu17t7R3UsI/k5ecvfzIo5VJ2bWMvyynrAb4wQg644yc/fPgBVmdmA4qz9bD52eUVl1mb3tDYUQcaw6MbMngX5AOzMrB250979Hm6pOjgTOB+aHfdUAvw3Pas427YFHw6OyCoAx7p7VhxDmiL2AZ4P9CIqAUe7+QrSR6uwK4B/hzuky4Cf19URZdSikiIikJ9u6ZUREJA0q7iIiOUjFXUQkB6m4i4jkIBV3EZEclLPF3czWV5seamb31vKYLW3CY57fCE8T7lut3fTkkenMrNTMpmcwfq22tz3h/Iow9xIzm2Rm30tafouZHVfDek8zs241LL/YzH4c3p9uZmlfBzIcEe/SpOm9zWxsuo+vZd0nh9v8jpktNLOfZ2K9NTzfTWb2q51cR4mZbQhHOlxoZveZWZ3/JjORqZb1l6QaxdTM+u3sqJNm1sPM3MxOrDY/Hr4+75rZvzefh5Di8W5mjydNF4V/BzXmMrPDzeykpOmdeg3r+z3YETlb3DOgP/Ceu/dw95kplu9pZgPrsmILLiJen54Kc3cBbgP+aWYHQ3AFLXefWsNjTwNSFnczK3L3+9z9sTrm2g3YUtzdfaW7n1nHdSXnakJwZZtT3P0wgvFtpu/sehvIB+FwB4cSvO6nJS8Mj7nPB0MIRuEcUm3+Bnc/PBw59b/AZdt5/FfAt8OTzyAYOfaTNJ73cOCkWltlobws7mZ2StJe+VQz26va8sOB24GTwr2GXVKs5g7g+hTrbm5mD1sw9vTbZnZMOH+omT1tZv8mGACpn5nNMLMxZva+md1mZudaMJ74fDPbP52stXH3aQSFb1i4vkfM7Mzw/m3hHuM8M7sz3MM/Fbgj3O79w73z/zWzGcAvUuyZnGdmr4V7Vn3C9W7VJlxWQvCPZv9w3Xck7wnW8rr908xeCD+J3J5iM1sTnNyyOtzmTe6+uKbXL8z4qJlNtmCs8NPN7Pbw+V8I/2FsHkf8j+H78qaZHZDiPd8/fMwcM5tpZgeF888Kt/0dM3u5lvcpBrwGHBD+bkwzs1HA/HBd14TretfMrkp67ussuL7BVODApPlbPlWZWTsLhiHYPDDaneF2zjOzK8L5vcLfxzkWfNprnzT/HTObxfYLK8CuZvasJX0CMbMLzeyupEw/M7NtzmI2MwPOBIYCJ5hZ8+08xyxqHihwIsEomBD8k3gy6TlaWnANhdnh78IgC04kugUYHP5ODg6bdwtfv2VmdmXSOnboPYicu+fkDYgDc5NuHwP3hst255sTuC4C/hTeH5rUZsv9FOueTjBG9kvAMeH96eGyXwIPh/cPCp+3ebi+cmCPcFk/YA3BWZHNCPYybg6X/QK4O92s1bJtM59gb3BieP8Rgj+kPYDFSeveLXl5tW39W9L0TcCvkpY9EN4/Gni3eptw+l2gJLy9mzS/JOkxNb1uy4A24fRHQKcU2/0gwUiOTwLnAgW1vH43EewpNgEOA74GBobLniUYkx5gOXBdeP/HwPgUr8OLQJfw/ncITvWHoDB3SH59q2VO3v4WBMNrDCT43fgK6Bwu6xWuqyXQClhA8Olk8/wWwK7A0mrvTWl4vx2wPLx/CcE4QEXh9B7ha/AaUBzOG0xw9jfAPOD74f07kt+/pO3oB2wkGPWwEJhC8DvWEvgAaBK2ew3onuLxRwEvhvdHAacnLVsf/iwEngYGbOdvcj3Bp5+x4e/J3DDX5vfrf4HzNr8XBNeFaEm1v5fwfX2N4G+yHcEOQ5O6vAdR37Jq+IEdtMGDj7tAsAdIUIQhGHDsqXDvpCnwYR2f4/8R7L3/JmneUcBfAdz9PTP7COgaLpvi7sljuM9290/DfB8Ak8P58wn+aWQqa6rRNNcR/EE+aGbPAzX1TT5Vw7InIRif3sx2te30iaahptftRXdfC2BmC4F92XroZ9z9IjPrTjAezK8IPpYPpebXb6K7V5nZfILisfmU9vkEhXerbQx/3pU0f/NomN8Dng52QIGgMAC8CjxiZmOA7Q2otr8FwzY48Jy7TzSzfsCb7r4561HAs+7+Vfic/wT6Enzyftbdvw7npzPO0nHAfR58UsDd/2vByJffBqaE21AIfGpmbQj+Kc0IH/s4wT+fVN5092VhjieBo9x9rJm9BJxsZosIivz8FI8dQjC4GeHP8/nm9dolfH1KCC4EM2V7G+bu88JPiEOA6sNfnEAwkNrmT5TNgX22s6rn3X0TsMnMVhEMf5DJ96BB5GW3DEERudfduwM/J3ijd5i7vxQ+9rtJs1MV0s2+qja9Kel+Imk6wTfj/mQiaw+Ci2hsEf5x9yHYizuNbwpbOrm3WlWK6Rhb/26lk7mm1y35dYqznTGR3H2+u99FUNjPCGfX9PptCh+XAKo83HVj69cftt7G6ttbAKzxoF94823z9xsXE/zz7wTMNbO2KWJ/ED6mh7vflDQ/+TWv6bXZ3vghye9B8jZbiscYsCApf3d3P2E7bdPNsXn6QYJ/sj8BHq7+IAu+UzgDuCHsOvorMNDCgcL4ZidtX4J/zjV1DUEwkOCdJHXJbH4q4IykbdzH3Rdt+3Ag9e9bXd6DSOVrcW/DN1+2XLCT67qV4IIIm71M0C2AmXUl2DtYvBPr36msZvZ9gv72B6rNbwW08WCAr6sIvlgC+JKgDztdg8P1HQWsDfewlxMOZWpmPYHOaay7zq+bmbUK93Y3O5yg+wYy814PTvo5K3mBB2PXf2hmZ4VZzMwOC+/v7+5vuPsNwOdsPVz1jngZOM3MWlgwKuIPgZnh/B+a2S5hMTwl6THLCboMIOgi2WwycLGFX+qb2ebuuWILr+dpZk3M7BAPhj1eG763EL4/29HHgtFaCwhep1cAPBjethNwDtsWXAg+Sbzj7p3cvcTd9+WbHY4twt+rK4FfWfh9yHY8BNyS4hPCJOCKsH8fM+sRzk/3970u70Gk8rW430TwMXomwR9dnYXFsSJp1t+AwvCj/lPA0PAjXl3dxI5n3fwF0fvAbwn2WKrvpbQGxpvZPGAGcHU4fzTwP+GXTvun8VxfmNlrwH3AheG8Z4A9wo/TlxD0b+Luq4FXwy+k7qi2np153Qz4dfil1lzgZoK9RcjMe93MzN4g+C7k6hTLzwUuNLN3CPpiN1/68Q4Lvrh8l6AIvFOXJ/fgMoaPAG8SXOXqQXd/O5z/FEH/8jMExWazO4FLwvemXdL8Bwm+z5gX5j3Hg0tWngn8MZw3l6CrCYI97hHhF6obaog5i+AL83cJur6eTVo2BnjV3b9I8bgh1doSbss5KV6Htwlew7O3F8Ldy939LykW/Z6g73xe+H78Ppw/jeAL1OQvVFOtty7vQaQ0KqRIDSxHLswcJQuONb/L3V+MOks+ydc9dxGpZxactPY+Qb+5CnsD0567iEgO0p67iEgOUnEXEclBKu4iIjlIxV1EJAepuIuI5CAVdxGRHPT/Ab8KQdECeef2AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "N = 1000000\n",
    "k, X = sample_half_normal_v2(N)\n",
    "1000000/k\n",
    "x = np.linspace(0,6,10000)\n",
    "plt.hist(X[0:k], bins=50, normed=True, label=r\"Stat\");\n",
    "plt.plot(x,np.sqrt(2/np.pi)*np.exp(-x**2/2), label=r\"PDF\")\n",
    "plt.legend()\n",
    "plt.xlabel(r\"Half Normal Distribution Samples Produced by AR Method\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAARcAAAENCAYAAAAlniEpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJztnXd8VFXax78nk0klIaG30KSEKmgWQRFUUCkKiIhgwQKiKPbdd13dxbq++25z1xULq4hiQRaluRQVUUEFBVEglNBDKgnpfZI57x93AiGEZBJm7mRyn+/nw2dm7j1z72+G5JfnPOec5yitNYIgCJ4mwNcCBEFomoi5CILgFcRcBEHwCmIugiB4BTEXQRC8gpiLIAhewRRzUUotVEqdUErtPsd5pZR6WSl1UCm1Uyl1kRm6BEHwHmZFLouAMbWcHwv0dP2bDbxmgiZBELyIKeaitf4GyKqlyUTgXW2wBYhSSrU3Q5sgCN4h0NcCXHQEjld5neQ6llq9oVJqNkZ0Q3h4+MWxsbF1XvxQziGCbEHERMR4Rq0f4Ch3kFNwguLyAsoop0yBO3OxbRqCtCJI2QkJDCcyvCVB9mCv6xUaL9u3b8/UWreu7/sai7moGo7V+LugtV4ALACIi4vT27Ztq/PiN396My1DWvLq6FfPS2Rjx1lRwdINL7Pu6EfsspcQGdCKjhUt6OoIobO9A+0iutMp+gJaRsUQHtyMwMAg8otyyclLJS03kdTcQ2SUppBMDseCnJQrhdKarmUOegf1YsyFd3D54Ot8/TEFk1FKHWvI+xqLuSQBVcOKTkCKpy4eFBBEmbPMU5drdDgrKnhzzQusTFtGYhA0D3QyoqIDwztP4vrLZxIUFFLva+bkZ7Lxx6VsPbqe/RxhldrHqp2/o9u2J7ko5EKmjvgf+nYZ4IVPIzQVGou5rALmKqWWAJcAuVrrs7pEDSXIFoSjwuGpyzUqvti2itd+mkdCcAWdlJO7Q67g7nHP0Tyi5XldNyqiFTdcdT83cD8ACYe38Z9vX2a7/pmPnT+zYuN0Bpc1Y2yvu5kyYhYBATKrQTgTU8xFKfUhcAXQSimVBDwN2AG01q8Da4BxwEGgCLjLk/e3B9gpLi/25CV9TmFJMc8tuZ317CMyUHOH/VLm3vwPQkLCvXK/Xt3jeKr7uwBs+WklH//0Kt8GJrHt2L9Y9NYrXBl9NQ9MeIGwoFCv3F/wP0wxF6319DrOa+ABb93fbrNTVtF0ukV7Enfz1LoZHAx2cFlJM3437k26xPQ37f5DL5rI0Ismkp2dyjtrf8/Gsi28W/gZaxd/xlXNruTBCS/SPLSZaXqExoklYtmggCAczqbRLVqxdRn3fT6NJHspc0Mu5/XZ35tqLFWJjm7PI7e8xfK7fua30RNpWaH5qGQj138wjGeXPkRRaYlPdAmNA0uYS1OJXN7+4lX+uOcZwrSTv8Y+yb03vwqqpoE2cwkItHPbhBf46O4dPN1yMp3KNcuKN3L94iG8tObPOJ1OX0sUfIAlzKUpjBa9vPbvvJz0Kp0cmvkjFzBy2K2+lnQWAYF2plz3LO/N/IknI66hmS5nYcZirntrCIu/W+preYLJWMNcbEGUO8t9LaPB/PvLf7MwfSGxpU7mj13CBT2H+1pSrQQEBjF98t/4zy2bmKv6UhZQyJ8PPM/Nb17NL8kHfC1PMAlLmIs9wH+7RUt/XMEbx/7JBWVOXhqzmA4x/jO3JCi8JffO+IiPxy3j1uLmHLalMPOzyTz00aPklzat0TvhbKxhLn6ac9l6dA9/3/UH2pVX8NcR/6Jdl4t9LalBNG/fjyfu3cTbvR5maEk5G0u+4LrFw3n9W+kqNWUsYS6VORd/2ukgszCPp76YgY0KXug1l26xo3wt6fxQiv6XzeaVu7byom0AkbqQ+Qef54a3b+RgpsfmSwqNCEuYiz3ADkC59o+8i9Pp5J6PbiEjsITfhlzCoJFemwJkPiGRXH/bBywZ/RYz8+GY2s8tq8by9GdvyKhSE8MS5hJkCwLwmyUAv//vXzloO8asohAm3LzA13K8Qni3y3jk3h9YGD6cWEcRn6S+wjWLrueH45LwbSpYylz8Ie/yzeFdrMtczNDiUuZM+QBsdl9L8h72UAbd9DoLr36TX+c6KVBHufeLG3lw9V9xlPtHlCmcG0uYS2W3qLHP0i0qK+XpL+8nXFfwu9g5BLbp5WtJphDYfQR33LuVD8OHcVlJEV9lvcNV707ixySJYvwZS5lLY59I99in/0umPYfHS6PpPuJhX8sxl+BmdJv6Ji9f/heeOVmIQx3hns9v4reSi/FbLGEu/tAt2np8P1tzP2F0YTGTJv8bLFrCIKD/Ddx491d8VNaGX5UWsCb1FUa+O4349ERfSxPqiSV+ght7t8jpdPLU578mmAoe6ng9tO3ra0m+JaozXWZ9zus9ZvBkZjbFeg+3/Hcyz3+12K+mE1gdS5hLYx8t+svmpaTbjjInt5Ru1z7razmNA1sgttHzmD75A5aeLGWAI5+lx/7M6Pdmkpx30tfqBDewhrkEuLpFjTDnkl9azLID/6B3aRnThzwGIZG+ltS46DaC7rO/YVFgZx7Nyiaz4kfGLZvI+79s8LUyoQ6sYS6uyKW0otTHSs7mic9fpSSwkAeLAgkaMsvXchonke0JvHMNd/e5nQ9SUmnrzONPOx7h9k/mUeJofH8wBANLmEuwzdgao7S8cZnL8dwMvst4n+FFxYy4ch4EBvlaUuPFZocx/0u/CW+w/EQmEwrL+Dl/OZe/N5mtSft8rU6oAWuYS6DLXBpZ5PL4+r9RoRzMLQtDDZjiazn+Qf8bCZ/1JS84I/j7iZM4dQqzPr+Fp798S5K9jQxLmEuIzdhaozGZy4GTKewrXMeEggL6DX8cAmy+luQ/tIlF3fMlV3ccwZrko/RwBPHJ8X8w+r2ZpORl+lqd4MIS5lLZLSqpaDw1XX//5SsoVcFdZUFw4TRfy/E/QiJh2vu0HfYwH6fs5e7CME5UbGfsshtYunujr9UJWMRcQgJdkUsjybkcyU5jb8Fariso4IJhD0GgbJfaIAJsMPppAm58i0ezjrI424HdqXhu28PMWv1so540aQUsYS6NLXJ56sv5oMqZWeiAwbf7Wo7/M2AK3LWGQU4nX584QKyjJ1uzljHyvZvYk3HY1+osi6XMpTHkXE4UZLMr77+MKSyme/+bZV6Lp+h4Mcz+ivDWfVmW/AVzuIj8ihRu/nQq83/8yNfqLIklzEUpRVBAUKMwlxe+eRsCHMzMzYFfybwWjxLRDu78LwyYyv1HVrA0qDeBjg68vucFpiybS15Jvq8VWgpLmAsYw9G+zrmUlpfxddpyBpVU0KvDJdCmj0/1NEnsITB5AYx8gr4HV7MlsIJuehz7Cr7hyiUT2JS43dcKLYNlzCXEFuLzyOWVH5bjtOUwMycLJVGL91AKrvwd3PAGwUlbWVmwkZmtH6e0vIL7v7ybP3z1TyqcFb5W2eSxjLkE24J9mtDVWrM04X1aOQK5XAdD73E+02IZLpwGty9HFaTx6J7neX/QEwSVDmLFsTcZ+9FtpBSk+Vphk8Yy5hISGOLTbtHaA1spUke4Jy8L24CbZPjZLLpdDjO/gKBwLlx3F5sumUCfwHtIKUlg3LJJfLJvna8VNlksYy6+jlxe/+l9bE4bk/JzYdB0n+mwJK17wawN0G4gYStm8lFXeKDnKzhKo3h662+Ys+5JistlkzZPYylz8dWkqpNFORwp/pZRxQGEtewFHS7yiQ5LE94K7lgF/SahPv8Dc/JX8p/r3yO8eDSb01dz9ZLJxGfKAkhPYilz8VXk8tKWj4zh55xEI2pRyic6LI89FG5cCEMfgK2v0ffbX7Nxxh8ZEvIE2aW5TP90Oq/+tEgWQHoI65iLj4aitdasT1xB69Jm9C1zQP8bTdcgVCEgAMa8CNe8APHLCV06lbcmXseTA/+Ns6gnr+36G9NWziarJMvXSv0ey5iLr4aivzj8IyUqiVvLHEZ3KKqz6RqEGrj0QZj8b0j8Ht4ex629W7DqpoVEF99EfPY2rl06iU3Hv/O1Sr/GMubiq27R6z99AE47004ehL4TTb+/UAsDp8ItSyH7KLx1Dd1VKp/Peoqrm/+RwhI79395L09v+lOjrb3c2DHNXJRSY5RS+5VSB5VST9RwvrNSaqNSaodSaqdSyqMTQUICQ0xP6BY7ijlQ8C39y1oTrrWYS2Okxyi481MoL4a3riY4dTsvTR7Hn4a+BXnD+OTw+1z/8c0cyzvma6V+hynmopSyAfOBsUBfYLpSqvr+Gb8HlmqtBwPTgFc9qSHYFkxJubmRy3s716EDSrjTkQvtL4QW3Uy9v+AmHQbDzM8gNBremQD71zFhYFfW3PoP2hbfS1J+MhOX38h/9n8iyd56YFbkMgQ4qLU+rLUuA5YA1f+Ma6ByiXBzIMWTAoJtwabnXP6zfyWqvBmjM/dK1NLYadEd7v4M2sTCkumw4z1iWoSx9p77uaHN3ygt7MBzW57m/s8fJ79MFkC6g1nm0hE4XuV1kutYVZ4BblNKJQFrgAdrupBSarZSaptSaltGRobbAoJtwVToCtM2RsssyiK1bAdxzvbYAHqPN+W+wnnQrDXc8Sl0GwkrH4DvXsFuC+D564fzylVvEJAzjk0pGxi37AZ+PvGzr9U2eswyl5omdlSPL6cDi7TWnYBxwGKl1Fn6tNYLtNZxWuu41q1buy3A7Gp0b2z/BJSTWbrEGCFq3duU+wrnSXAzuOUjI9L87CnY8DxozajY9qy/81m6lf0PWYUOZqy9g39tf1UWQNaCWeaSBMRUed2Js7s9M4GlAFrr74EQoJWnBJhdjW7d0f9CaTuGZeyAntfIxDl/IjAYprwNF82ATX+F/z4OTiftmoewfOZ0bu/8D8pyB7Jg92tMX30HqQWpvlbcKDHLXH4EeiqluimlgjAStquqtUkERgEopfpgmIv7/Z46qIxczEjqHslJJMd5kGH27ihHEfS81uv3FDxMgA2ufxkuewS2vQWfzILyMgJtATxx7WAWjnsJe9Yt7Mnay4TlN/DZ0c98rbjRYYq5aK3LgbnAemAvxqhQvFLqOaXUBFezx4F7lFK/AB8Cd2oPpubDAsMATFmgtvDnlQDMsjshMAS6Dvf6PQUvoBRc/SyMfgZ2fwxLboGyIgAu7dGK9bMeo6/zGQoLW/D414/z1KZ5FDmKfCq5MRFo1o201mswErVVj82r8nwPcJm37h9mN8ylqNz7//lfJX2BLulEXMk26DYCgsK8fk/Biwx/1BimXv0ILL7ByMmERtE6Ipgld13H/K97Mn/HfFbpFWxL+4l/jvorsS1ifa3a51hmhm5l5OLtvyxJecnkVBymf1BfArIPQ4+rvXo/wSQuvhNuehuSt8Oi66DgBAABAYoHr4zlvcnPEnpyDsl5WUxbPZ1349+1/JwYy5hLaGAo4P1u0bs7PwXgzsgI48AFV3n1foKJ9HNFLVmHYOG1kH161m5c1xasv28mFwe+QEl+T/6y7S/M/mwOmcXW3QHSMuZiVrfo82Of4yxpz6jyIxDRAVpe4NX7CSbTYxTMWAlFWbBwDGQknDoVHR7EohlX8usL/4QjfRJbUn9g4vIb+Tb5Wx8K9h3WMRcTukVphWlklu+no/0S7Mc2G/kWGYJuesQMgbvWgLMc3h4LabtPnVJKMevy7iy95XEiTz5OTkEQ931xHy9u/V/LVbuzjrnYvT9a9OFuI189vX0sFGUa5iI0Tdr2g7vWGnNiFo2HpDO3LBnYKYq1D0xlRPjzlGVdyof7PuCGFTdaamavZcwlxGbMc/Fm5LLuyOdUlLZhSqir0FC3y712L6ER0KqHYTChUfDuRDh6ZvcnMsTOq7dcwosj/oAz+V6ScwqYsXYGf9v2N9MX0foCy5iLLcBGiC3Ea5FLflk+KSV7iNaDiEj9DqK7SWEoKxDdBe5aB5Ed4L0b4eCGM04rpbjx4k6sufcuupU+TWn2EBbFL2LK6qnszNjpI9HmYBlzAaNr5K2E7sZj34Fycmn7oXB0s3SJrERkeyMH06oHfDgN9v33rCZdWobz8X1Xck+f31CcOJPj2TnctuZ2/vnTP31WON7bWMpcQgNDvdYtWrn/S3RFMLd3aAWledBVukSWIrwV3LEa2g2Ej26HXcvOamK3BfDra3vz/q23E3bif3DkXMSbu95k6uqpxJ+M94Fo72Ipc/FW5KK1ZmfWVlRJL/qXu4YmOw/1+H2ERk5oNMxYAZ2Hwcez4KfFNTa7pHtL1j10LVe1fpCixDs5lnOSW/57K//a8a8mFcVYyly8FbkczD5EiT5Jr8g4ApK2GvNbmnfy+H0EPyA4Am79jzF5ctVc2PpGjc2ah9l5Zfpg/jR2KqVHH8WZN4gFOxcwZfUUdpzYYbJo72ApcwkLDPNKQveTfUYSb3yPkXD8B+h8icxvsTJBYTD9Q4i9Dtb+D2z6e43NlFLcFBfDmrnX0l3dQ1HiXaTm5TNj7Qxe2PICBWUFJgv3LJYzF290izYmbqKitA2TurSA3OMQI10iyxMYDDctggE3wYZnTxWdqomurcJZdt8w5gwZz8l9DxJUOJKl+5cyaeUkvj7+tbm6PYi1zMUe5vFuUZGjiJSSeKIZQIuTrnA2ZohH7yH4KTY73PDG6aJTn/3+nAZTmexdOvsKwgtupPDoHEpKg5j75Vx+8/Vv/HKNkrXMxQuRy7fJW9GqnLi2w+D4VrCHQbsBHr2H4MdUFp265D74/hWjm1TLaum4ri1Y+/Dl3DxwOEm77yWi6Dq+OLaBiSsmsuLgCr9aaW0pcwkNDPV4zmXFvi/RTjsTY4cb5tLxYuMvliBUohSM+RMMmws/LIBPHwWn85zNw4MDefGGAbx95zAcWaMoPPIgYaoDf/j2D9y9/m4O5RwyUXzDsZS5hAeFU1xeTLmz3GPX/ClzC86iCxjWKRJSd0qXSKgZpYz9qYc/BtvfhtUPQh3Fva+MbcNnj4zg6h4XcuDnGbQpvYV9WQlMWTWFl7a/1Oir3lnKXCLsRo2VQkehR66XmJdIQUUaHYMHEXoyHnQFdPqVR64tNEGUglHzYORvYcd7sOL+Og0mOjyIV24ZzD+nXURGykXkJDxKbMQVLNy9kEkrJ/Fl4peNtqtkLXMJMswlryzPI9f7/Mg3AIyIuRxSXKtd2w/yyLWFJopScOWTcOXvYecS+OQeqKg9klZKMXFQR9Y/OoK4mBi+3zqaXhW/JdgWxsMbH+bBLx8kKT/JpA/gPpY0F0/NH1h/+CucZS0ZF9sfUnZAs3bGOhNBqIuRv4HRzxqFv5fdBW5sdt++eSjv3DWE5yb2I/5IS47+Mptr2s3ih7QfmLRyEgt2LjB9V9HasKS5eGI7ztKKUhLyfkYV92ZgpyjDXDoMPu/rChZi+CNw7YuwdxUsvQPc2LAvIEAxY1hX1jx0Ob3bRvHxxh70cjzPkLbD+deOfzFpxSQ2JG5oFF0lMZcG8lP6T1RQSq/IOOzlhZCZIOYi1J9hD8C4v8L+/xoLHh3u1Xnp3roZH907jHnX9WXbISebvh3LrV3+SHBgMI9sfIR7PruHhOyEui/kRaxpLo7zN5fPjnyNdtq4uttlxigRWsxFaBhD7oHr/gEH1sOS6eBwb7qELUBx9/BurHt4BH3aRfL6OhuRJ3/LAwN+w77sfdy0+iZe2PIC2SXZXv4ANWMpc2lmbwZ4JnL5JmkzFUXduLxHR6NLBNBBkrlCA4m7Cya8Aoc2wgdTocz9Ec2urcJZMnsoz07ox49Hcpm/si2zur7BtN7TWJawjPHLx/P+3vdxOOvO63gSMZcGkFaYxomSY9hKY+nTPtIwl8iO0KyNJ2QKVuWi243lAkc3w/s3Qan7P6cBAYo7Lu3K+kdG0K9jJM+sOMqe3Vcx/4r36N+yP3/64U/cuOpGU4euLWUutgAbzezNzttcNidvBqBP1BBsAUqSuYLnuPBmmPxvSNxilM0sqd+0ic4tw/hg1lCen9Sf7ceymf1mEpdHPMk/r3gZrTUPb3yYO9fdaUqhcEuZC0CzoPM3l68SN+F0NGdEl37Gf37WIZnfIniOAVNgykJjd8fFk6A4p15vDwhQ3D60C+sfGcGgzlH8YWU8r60N5q/DFvOHoX8gMT+R29feziMbH+FI7hEvfQgLmktEUMR5mYvD6WBr2hbKC3ozpFtLOLHXONGuv4cUCgLQbxJMfdcYLHh3orEJWz2JaRHGezMv4c9TBpKQXsD1//qelOODWD5hNQ8MeoDvU77nhpU38Nz3z5FRlOHxj2A9c7FHnNdo0c6MnZRUFKGKe3NhTBSkuzbEatvPQwoFwUXseJj2PpzY02CDUUoxNS6GLx4byZj+7fjHFweY8up24ppPZc3kNUztPZXlB5Yzfvl4Xv7pZXJLcz0m33LmEhkUeV6Ry+bkzaADiI26mBC7DdLjITgSmsd4UKUguOh1LUz7EDL2w7sTGmQwAK0jgnl5+mDevvNXFJdVMOX173lpfQpzL/wNKyetZGSnkfx7178Z+/FYXvvlNY/MYreeuQRHklNavz5sVTYlbcZZ3IWhXTsaB9LjjahFyloK3qLnaJj+gbEv9TsToPBkgy91ZWwbPnt0BHdf1o0PtiZy9d+/Zk9iEH8Z+ReWXb+MuHZxvPrzq4z5ZAxv7XrrvFZeW85cWoS0ILsku0HDcZnFmezP3oejoBdDukUbRX9O7JEukeB9eow26vKePGBEMOdhMOHBgcy7vi/L77+MFuHB3Pfedu5dvI3mti68fNXLLBm/hAGtBvCPn/7B2E/GNvg+ljOX6JBoSitKG1Q06ruU7wCoKOzFxZX1ckvzxFwEc+gxymUwB+Gd66Hw/EpfXhgTxaq5l/HbMbF8tT+D0X//moWbj9A7ug+vjX6NxWMX079VwwcqrGcuwdEAZJXUv++6OXkzgTqSHlG9aB5qN7pEAG1lpEgwiQuugulLjOkP70w4b4Ox2wKYc8UFfPboCC7uEs1zn+5h4vxv2ZGYzaA2g5g/an6Dr22auSilxiil9iulDiqlnjhHm6lKqT1KqXil1Afe0NEipAVAvddbVDgr+C75O8oLenJxl5bGwcqRojZ9PClREGrngivhlo8g67ARwRSc/zByl5bhLLrrV8y/5SIyC0qZ/Np3PLV8F7lFDV8yYIq5KKVswHxgLNAXmK6U6lutTU/gd8BlWut+wCPe0FJpLvWNXOJPxpNblktxXi8Gx0QZB9PjIbqrsRGWIJhJ9ytcBnPEYwajlGL8wPZ88dhI7rq0Gx/+kMiov3/V4OuZFbkMAQ5qrQ9rrcuAJcDEam3uAeZrrbMBtNYnvCEkOqRh3aJvk78FFOWFPRjcuYq5SJdI8BXdR8KtSyH7KLxzHRR45lcmIsTOvOv7smrucGPtXAMxy1w6AservE5yHatKL6CXUupbpdQWpdSYmi6klJqtlNqmlNqWkVF/tz7VLSqtX7doc8pmomwXEGFvTvdWzaC8DE4egtax9dYgCB6j2whj+9icRFh0HeSne+zS/Ts2Z/HMSxr8frPMpaZJINXHggOBnsAVwHTgTaVU1Flv0nqB1jpOax3XunXregsJDQwl2BZcr5xLTkkOuzJ24SzsxaCYKAIClNHf1RXQune9NQiCR+l2uWEwuceNCCY/zdeKAPPMJQmoOoW1E5BSQ5uVWmuH1voIsB/DbDyKUorokOh6dYu+T/0ejSY9revpfEvmfuOxVS9PSxSE+tN1ONy6DHKTXRGM7w3GLHP5EeiplOqmlAoCpgGrqrVZAVwJoJRqhdFNOuwNMa1DW9drodbm5M2EB0ZSXtyJQZX5lkxXCcFWHvc/QWgYXS+D25ZBXgosGg95qT6VY4q5aK3LgbnAemAvsFRrHa+Uek4pNcHVbD1wUim1B9gI/EZr3fBpiLXQLrwdaUXuObtTO9mcvJkOwRcCAQyKMRLCZCQY64mCwr0hURAaRpdL4baPjcjlnet8ajCmzXPRWq/RWvfSWl+gtf6j69g8rfUq13OttX5Ma91Xaz1Aa73EW1rahrUlrTDNrSUAe0/uNbpQRbF0bRlGi/Ag40RmgkQtQuOky7DTBrNovBHJ+ADLzdAFI3IpLi92q/TCN0nfoFAcT+7MoMp8i9MJmQeglSRzhUZK56Fw2yfG8PSi8UYuxmQsaS5tw9sCRi3cutiUvInY6H5k5NoZ3NnVJcpLBkehRC5C46bzJXD7J8YEu0XjIdfcXRktaS7twtoBdZvLyeKT7M7cTaeQiwFORy6VyVwZhhYaOzFD4PblUHTSdIOxprmEu2cu36V8h0ZjK+lDkC3g9GzFUyNFMgwt+AExv3IZTJZhMDnH636PB7CkubQObY09wE5SQe0u/k3SN7QObU3yiRb0bhdBUKDr68pMgJAoCK//JD5B8Amd4uD2FVCU7TKYRK/f0pLmYguw0SWyS62Vz0srStmUvIkRnUYQn5xP/47NT5/MSDCiFqk+J/gTnS6GGcuN3QQWjYfsY169nSXNBaBb824czT16zvPfp3xPoaOQC6NHkFvsYEBVc8k6BC17eF+kIHiajhfDjBVQkmvMg/GiwVjWXLpGduV4/nEcFTXXq/j82OdEBkViKzNGhE6ZS1kh5KdCy+5mSRUEz9LxIpix0usGY1lz6da8GxW6gsT8s/uejgoHGxM3ckXMFexJKcRuU/RqZ2wFS/ZR47GFmIvgx3QY7HWDsay59Io2Rnr2nNxz1rlNyZvId+RzTZdr2J2cS6+2EQQH2oyTWa7lTmIugr/jZYOxrLn0iOpBWGAYv2T8cta55QeW0yq0FZd2uJRdybnV8i0uc4nuZpJSQfAiXjQYy5qLLcDGgFYD2Jmx84zjGUUZbErexIQLJpCW6yC32HHmSFHWYQhrCaFnlZoRBP/ESwZjWXMBuLjtxezL2kdm8ekK6h/u+xCndjK552R2JRtbW54ZuRyRqEVoenjBYCxtLqO6jEKj+TLxSwByS3P5cN+HjO4ymi6RXdiZlEtggKJ3uyoFuLOOSL5FaJp42GAsbS49o3rSM7on7+99n3JnOX/+8c8Ulxdz78B7AU4lc0PsrmRuealRSlDMRWiqeNBgLG0uSikeuPAC8fzoAAAUNklEQVQBDuce5rrl17Hq0Cru7n83vVv0Rmt9djI3+xigxVyEpk1Vg1l0XYMvE+huQ6XUc+c6p7We12AFPmZUl1E8ecmTrD60mkk9JjF74GwAkrKLjWRupxpGisRchKZOpcF8NKPBl3DbXDizwDZAO2AksLzBd28kTI+dzvTY6Wcci08xkrn9O1TZt0XMRbASHQbDg9vhseAGvd1tc9Fa31X9mGtvoek1NPd79qTmE6Agtl01cwmOhLAWvhMmCGYSGNTgt55vzuUzYNJ5XqNRsjc1j66twgkNsp0+mH0UorvIamhBcIP65Fyq9wXCgFs4cyfFJsPe1DwujKk2US4nUUpbCoKb1CfnchBjl8TKP9tFwA7gDk+L8jV5JQ6SsouZPqTz6YNaG8PQPUb5Tpgg+BH1yblYZth6X6qxK0Cf9lUmzxWdBEcRRHU+x7sEQaiKZQyjPuxNzQM4XTMXTpcFFHMRBLcQc6mBval5RIXZaRcZcvpgpbk0rz4iLwhCTYi51MDe1Dz6tItEVR0VynXlrSVyEQS3EHOpRoVTsz89/8wuERiRS3CklFoQBDcRc6nGkcxCShxO+naowVwkahEEtxFzqcbpZG7EmSdyjku+RRDqgZhLNfam5hEYoOjRptnpg1pL5CII9UTMpRp7U/Po0abZ6YLcACU5UJYv5iII9UDMpRp7U8+RzAWIkm6RILiLmEsVsgvLSMsrqSHfIhPoBKG+iLlUocaZuWAkcwGai7kIgruIuVRhz7nMJS8ZAkOljosg1APTzEUpNUYptV8pdVAp9UQt7aYopbRSKs4sbZUkpOfTqlkQrZpVq7yVlwyRHaSOiyDUA1PMRSllA+YDY4G+wHSlVN8a2kUADwFbzdBVnYT0Anq1jTj7RF6KYS6CILiNWZHLEOCg1vqw1roMWAJMrKHd88CfgRKTdJ3C6dQcSM+vxVw6mi1JEPwas8ylI2dWrEtyHTuFUmowEKO1/rS2CymlZiultimltmVkZHhMYHJOMYVlFWebi9MJ+akSuQhCPTHLXGpKVuhTJ5UKAF4CHq/rQlrrBVrrOK11XOvWrT0mMCHdKBDVu12zM08UZoCzXMxFEOqJWeaSxJlbk3QCUqq8jgD6A18ppY4CQ4FVZiZ1E9ILAOjRplrkkpdsPEq3SBDqhVnm8iPQUynVTSkVBEwDVlWe1Frnaq1baa27aq27AluACVrrbSbpIyE9n/bNQ2geaj/zRJ7LAyPbmyVFEJoEppiL1rocmAusB/YCS7XW8Uqp55RSE8zQUBf702pJ5oJELoJQT+pT/f+80FqvAdZUO1bjNrBa6yvM0FRJhVNzMKOA4T1bnX0yLxkC7BBWwzlBEM6JzNAFjp0spKzcSc82zc4+mZdidIkC5KsShPogvzFUHSmqoVuUnypdIkFoAGIuwP60ApTizAJRlVRO/RcEoV6IuQAJJ/KJiQ4jLKhaCkpro1sUISNFglBfxFyAhHONFBVnQ3mJdIsEoQFY3lzKyp0cySw8e2YuVJlAJ90iQagvljeXI5mFlDv1Oea4pBqPYi6CUG8sby77XSNFNZpLQbrx2KytiYoEoWlg2iS6xkpCWj62AEX31uFnnyxIMx7FXCyL0+kkKSmJwsJCX0vxGna7nTZt2hAZGVl343pgeXPZn55P15ZhZ24lUknBCQhpDvaQs88JliAzMxOlFL179yagCU6k1FpTXFxMcrKRX/SkwTS9b6ueHEjPr3nyHEB+mkQtFicnJ4e2bds2SWMBUEoRFhZGx44dOXHihEev3TS/MTcpLqvgWFZRzfkWMCIXMRdLU1FRgd1ur7uhnxMaGorD4fDoNS1tLgdPFKA19D6nuaSLuQgoCxRm98ZntLS5VI4U9azJXLQWcxGE88DS5nIgPZ8gWwBdW4adfbKsABxFECHmIggNwdLmsj89nwvaNCPQVsPXUOBKbknkIggNwtLmYqwpqmHaPxgjRQDN2pgnSBCaEJY1l/wSBym5JbWMFFXOzm1nnihBqCdOp5PnnnuOmJgYOnTowOrVqwkKCiI7O9vX0qw7ia6y2n+tI0Ug3SLhDJ5dHc+elDyv3qNvh0ievr6fW22feeYZvvrqK7Zs2UJ4eDhjx46lbdu2REdHe1WjO1jYXGpZUwSGuQQEQqjv/5MEoSYyMjJ46aWX2LFjBx07GmVBrrnmGn788UcfKzOwrLnsT8sn1G6jU3RozQ0qJ9A10ZmZQsNwN6Iwgw0bNtCjRw969Ohx6lhWVhYDBgzwoarTWPY358CJfHq2bUZAwDkmD+WnSTJXaNRkZmbSocPpciAVFRWsXbuWgQMH+lDVaSxrLgnpBefuEoErcpFkrtB46dOnD9999x0HDx4kLy+Phx56iEOHDknk4kuyC8vIyC899zA0uGbnSuQiNF5GjRrF9OnTGTx4MHFxcQwaNIiwsDBiY2N9LQ2wqLkk1DbtH6Ci3NiAXkaKhEbOq6++Sn5+PgkJCVRUVHDVVVcRFBTka1mARRO6CSfqGIYuzgK0RC5Co2bLli20b9+emJgYNmzYwLx581i1alXdbzQJS5rLgfR8IoIDad/8HEWgCjOMx7CW5okShHqyY8cOxo8fj8PhoFevXixatIihQ4f6WtYpLGku+9Py6dG22bmXmRdmGo/hrc0TJQj1ZM6cOcyZM8fXMs6JJXMuB04U0KtNLSNFRZXmIpvPC0JDsZy5ZBaUklVYRq9zlbaE05FLmJiLIDQUy5nL6Wn/tQxDF2YCCsJamCNKEJog1jOXtDrWFIHRLQprAQE17AggCIJbWM9cThTQPNROm4jgczcqzJAukSCcJ5YzlwPpRoGoWgsSF56UkSJBOE9MMxel1Bil1H6l1EGl1BM1nH9MKbVHKbVTKbVBKdXF0xq01iSkF5x7Zm4lRZkQLnNcBOF8MMVclFI2YD4wFugLTFdK9a3WbAcQp7UeCCwD/uxpHSfyS8ktdtCrTS3JXJBukSB4ALMilyHAQa31Ya11GbAEmFi1gdZ6o9a6yPVyC9DJ0yJOjRTVNgxdUQ7F2dItEoTzxCxz6Qgcr/I6yXXsXMwE1tZ0Qik1Wym1TSm1LSMjo14iKktb1jpSVJxlPMoEOkE4L8wyl5qyp7rGhkrdBsQBf6npvNZ6gdY6Tmsd17p1/aKLA+n5tAgPolWzOkaKQNYVCX6BFOg2IpWYKq87ASnVGymlRgNPASO11qWeFrE/vZatRCqRdUVCbax9AtJ2efce7QbA2D+51bQxF+g2K3L5EeiplOqmlAoCpgFnrA1XSg0G3gAmaK1PeFqA1pqDdVWfA1lXJPgNlQW6Fy5cSMeOHYmKiuKaa645VYlu8uTJJCQk+EyfKZGL1rpcKTUXWA/YgIVa63il1HPANq31KoxuUDPgP645KIla6wme0pCaW0J+aXndw9CyrkioDTcjCjOoq0D3oUOHuOCCC3wlz7ySC1rrNcCaasfmVXk+2pv3PzVSVOcwtKwrEvyDcxXofvbZZykpKSEwMBCbzXdLWCwzQ3efa01RbLvI2hvKuiLBT6itQPe+fft8XkvXOuaSmkeH5iE0D7PX3lAm0Al+Qm0Funfv3k3fvtXnqZqLZcxlb2o+se3riFrAta5IzEXwD85VoDs+Pp5+/Xy7gZslzKW0vIJDGQXE1jYzt5LibMm3CH7Bli1bOHbsGE6nk88//5x58+bx1FNPARAfH8+LL77I6NGjGT16NCdPnjRdnyVq6B46UUi5U9PHncilOEv2hxb8gtoKdDeGXQAsYS57U/MA6NO+jshFayjKglCJXITGjxTobgTsS8sjKDCAri3Da29YVghOh0QuguABLGEue1Pz6d02gkBbHR+3ctGi5FwE4byxhLnsS8tzP5kL0i0SBA/Q5M0lI7+UzIIy94ahi1yRi3SLBOG8afLmciqZW5/IRbpFgnDeNHlz2ZdmmItbkUuxRC6C4CmavLnsTs6jffMQWoQH1d24qDLnIuYiCOeLBcwllwEdm7vXuDgb7OEQWEulOkEQ3KJJm0teiYPDmYX1MJcsybcIgodo0uYSn2zkWwZ0qkfkIl0iQfAITdpcdiXnALgfuRTJuiLBv5AC3T5iV3IeHaNCaVlbtf+qFGdD89p2PBGszv/98H/sy9rn1XvEtojlt0N+61ZbKdDtI3Yl5dC/oxtD0JXIimjBj6irQPfQoUMpLCw81b7yuFk02cglt9jB0ZNF3BQXU3djAKfTlXORhK5wbtyNKMygtgLdWmuKi4sJDzcW66akpNC+fXtT9TXZyOWX4/XMt5TmgXZK5CL4Decq0D1w4EASExPp0qXLqXO7d++mf//+puprsuay7Vg2AQoGd45y7w2yIlrwM2or0B0fH3+GmYi5eJDtx7Lo3S6SiJA6CnJXIiuiBT+jtgLde/bsoXfv3qfabt++nbi4OFP1NUlzKa9wsiMxh7gu9ejiyNR/wQ85V4HuwMDAU8PRycnJHDx4kIEDB5qqrUkmdPel5VNUVkFc13oYhayIFvyMLVu20L59e2JiYtiwYQPz5s07VTv3jjvuYNq0aaxbtw6ABQsWmK6vSZrLtqNG/iSuaz2MQlZEC35GbQW6o6OjWb9+vU/1NUlz+fbQSTpFh9IxKtT9N5XkGo8hbo4uCYKPkQLdJuOocPL9oZNc3rN1/d5YkmusiLa5mQAWBKFWmpy5/HI8h4LSckb0rOeuiSU5ErUIggdpcubyTUIGAQou7VFfc8mFUDfnxAiWQmvtawlexxufscmZy/r4dOK6tKB5aD27NyW5ErkIZ2Gz2XA4HL6W4XWKi4ux2z2bEmhS5nLwRAH70/MZN6Bd/d9cLN0i4WyioqJIT0/H6XT6WopX0FpTVFREcnIybdq08ei1m9Ro0ac7U1AKxg5owAKtklxo08fzogS/plWrViQlJbF//35fS/Eadrudtm3bEhlZjwoCbtBkzMVR4WTJD8cZ3qMVbSND6n8B6RYJNRAQEEDnzp19LcMvaTLdojW7UknLK+GOYV3r/2an01gVHSIJXUHwFKaZi1JqjFJqv1LqoFLqiRrOByulPnKd36qU6urutYvKyvnL+v3EtovgytgG9BvLCoxyCxK5CILHMMVclFI2YD4wFugLTFdK9a3WbCaQrbXuAbwE/J871z6RX8KDH+wgJaeYZyb0wxag6i9QZucKgscxK+cyBDiotT4MoJRaAkwE9lRpMxF4xvV8GfCKUkrpWgbgdyfnMuSPGwhQ8OzE/gzt3rJh6sRcBMHjKDMmCCmlpgBjtNazXK9vBy7RWs+t0ma3q02S6/UhV5vMateaDcx2vewP7Pb6B/AcrYDMOls1DvxJK/iXXn/SCtBba+3GZutnYlbkUlNfpbqrudMGrfUCYAGAUmqb1trcCjjngT/p9Set4F96/UkrGHob8j6zErpJQNVK2Z2AlHO1UUoFAs2BLFPUCYLgccwylx+BnkqpbkqpIGAasKpam1XAHa7nU4Ava8u3CILQuDGlW6S1LldKzQXWAzZgodY6Xin1HLBNa70KeAtYrJQ6iBGxTHPj0uaX1zo//EmvP2kF/9LrT1qhgXpNSegKgmA9mswMXUEQGhdiLoIgeAW/MBdvLh3wNG5ofUwptUcptVMptUEp1aWm65hFXXqrtJuilNJKKZ8NobqjVSk11fX9xiulPjBbYzUtdf0sdFZKbVRK7XD9PIzzhU6XloVKqROu+WY1nVdKqZddn2WnUuqiOi+qtW7U/zASwIeA7kAQ8AvQt1qb+4HXXc+nAR81Yq1XAmGu53N8pdVdva52EcA3wBYgrrFqBXoCO4Bo1+s2jfm7xUiUznE97wsc9aHeEcBFwO5znB8HrMWYjzYU2FrXNf0hcjm1dEBrXQZULh2oykTgHdfzZcAopVQDFhmdN3Vq1Vpv1FoXuV5uwZjz4yvc+W4Bngf+DJSYKa4a7mi9B5ivtc4G0FqfMFljVdzRq4HKIirNOXvul2lorb+h9nllE4F3tcEWIEopVWvhJH8wl47A8Sqvk1zHamyjtS4HcoEGLjQ6L9zRWpWZGH8NfEWdepVSg4EYrfWnZgqrAXe+215AL6XUt0qpLUqpMaapOxt39D4D3KaUSgLWAA+aI61B1Pdn2y+KRXls6YAJuK1DKXUbEAeM9Kqi2qlVr1IqAGOF+p1mCaoFd77bQIyu0RUYEeEmpVR/rXWOl7XVhDt6pwOLtNZ/U0oNw5jn1V9r3Rhratb7d8wfIhd/WjrgjlaUUqOBp4AJWutSk7TVRF16IzAWh36llDqK0dde5aOkrrs/Byu11g6t9RFgP4bZ+AJ39M4ElgJorb8HQjAWNTZG3PrZPgNfJZDqkWgKBA4D3TidGOtXrc0DnJnQXdqItQ7GSPT19Ifvtlr7r/BdQted73YM8I7reSuMML5lI9a7FrjT9byP65dV+fDnoSvnTuiO58yE7g91Xs9XH6SeH3ockOD6pXzKdew5jL/8YDj+f4CDwA9A90as9QsgHfjZ9W9VY/5uq7X1mbm4+d0q4O8YdYJ2AdMa83eLMUL0rct4fgau8aHWD4FUwIERpcwE7gPuq/Ldznd9ll3u/BzI9H9BELyCP+RcBEHwQ8RcBEHwCmIugiB4BTEXQRC8gpiLIAheQcxFEASvIOYiCIJXEHMRBMEriLkIXkcpdYFSKquywJBSqoNSKlMpdYWPpQleRGboCqaglLoHeAy4GFgO7NJa/9q3qgRvIuYimIZSahXGQj4N/Er7dkW44GWkWySYyb8xSjj8S4yl6SORi2AKSqlmGKt/NwJjgQFaa9mutwkj5iKYglLqLSBCaz1VKbUAiNJaT/W1LsF7SLdI8DpKqYkYhZzucx16DLhIKXWr71QJ3kYiF0EQvIJELoIgeAUxF0EQvIKYiyAIXkHMRRAEryDmIgiCVxBzEQTBK4i5CILgFcRcBEHwCv8Pa2Ksi1G3hWEAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(0,1,10000)\n",
    "z = -np.log(x)\n",
    "g = np.exp(-(z - 1)**2 / 2)\n",
    "gl = 1 - (z - 1)**2 / 2\n",
    "gu = 1 - (z - 1)**2 / 2 + (z - 1)**4 / 8\n",
    "plt.plot(x,u,label=r'$g$')\n",
    "plt.plot(x,gl,label=r'$g_L$')\n",
    "plt.plot(x,gu,label=r'$g_U$')\n",
    "plt.xlim(0.0, 1.0)\n",
    "plt.ylim(0.0, 1.0)\n",
    "axs = plt.gca()\n",
    "axs.set_aspect('equal', 'box')\n",
    "plt.legend(fontsize=\"12\")\n",
    "plt.xlabel(r\"x\",fontsize=\"12\")\n",
    "plt.ylabel(r\"u\",fontsize=\"12\")\n",
    "plt.savefig('squeeze.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 正态分布抽取\n",
    "\n",
    "在本章最后，我们单独介绍一个特别重要的分布的抽样方法——正态分布。服从 $N(\\mu, \\sigma^2)$ 的正态分布相应的 PDF 为\n",
    "$$\n",
    "\\begin{equation}\n",
    "  f(z) = \\frac{1}{\\sqrt{2\\pi \\sigma^2}} e^{\\frac{-(z -\n",
    "      \\mu)^2}{2\\sigma^2}}, \\sigma^2 > 0, z \\in \\mathbb{R}.\n",
    "\\end{equation}\n",
    "$$\n",
    "关于正态分布的一些性质，大家应该是熟知的：\n",
    "+ 若 $U$ 服从正态分布 $N(0, 1) $，则 $Z = \\mu + \\sigma U$ 服从 $N(\\mu, \\sigma^2)$ 分布；\n",
    "+ 若 $Z_1, Z_2, \\cdots, Z_n$ 是分别服从 $N(\\mu_1, \\sigma_1^2), N(\\mu_2, \\sigma_2^2), \\cdots, N(\\mu_n, \\sigma_n^2)$ 的独立随机变量，则 $Z = Z_1 + Z_2 + \\cdots + Z_n$ 服从分布 $N(\\mu_1 + \\mu_2 + \\cdots + \\mu_n, \\sigma_1^2 + \\sigma_2^2 + \\cdots + \\sigma_n^2)$.\n",
    "根据以上的性质，我们知道我们只需要抽样生成 $N(0, 1)$ 就足够了。我们之前已经介绍了如何由 AR 法产生半正态分布，进而抽样改造成标准正态分布。下面我们再介绍两种简单的抽取方法。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "假设\n",
    "$$\n",
    "\\begin{equation}\n",
    "  Z_n = \\sqrt{12/n}(X_1 + X_2 + \\cdots + X_n),\n",
    "  \\label{eq::normal_naive}\n",
    "\\end{equation}\n",
    "$$\n",
    "其中 $X_i$ 是独立的服从 $U(-\\frac{1}{2}, \\frac{1}{2})$ 的随机变量，那么显然有对 $i = 1, 2, \\cdots, n$, $E[X_i] = 0$, 且\n",
    "$$\n",
    "D[X_i] = \\int_{-\\frac{1}{2}}^{\\frac{1}{2}}x^2 dx = \\frac{1}{12}.\n",
    "$$\n",
    "也即 $Z_n$ 的头两阶矩和 $N(0, 1)$ 一致。当 $n \\to \\infty$ 时，$Z_n \\sim N(0, 1)$. 如果我们取 $n = 12$，那么甚至连根号都不用计算了，但是这时我们发现 $Z_{12}$ 实际上分布在 $(-6, 6)$ 区间而不是 $\\mathbb{R}$. 这个方法只有在条件简陋的情况下可以用一下。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第二个方法可以总结成一个定理，由Box and Muller在1958年提出：令随机变量 $U$ 和 $V$ 分别服从 $U(0, 1)$ 和 $E(1)$（表示参数为 1 的指数分布），那么\n",
    "$$\n",
    "  \\begin{equation}\n",
    "    X = \\sqrt{2 V}\\cos 2\\pi U\n",
    "    \\label{eq::normal_box_muller_xi}\n",
    "  \\end{equation}\n",
    "$$\n",
    "  和\n",
    "$$\n",
    "  \\begin{equation}\n",
    "    Y = \\sqrt{2 V}\\sin 2\\pi U\n",
    "    \\label{eq::normal_box_muller_eta}\n",
    "  \\end{equation}\n",
    "$$\n",
    "是服从 $N(0, 1)$ 的独立随机变量。\n",
    "\n",
    "**证明：** 注意到\n",
    "$$\n",
    "  f_U = 1, f_V = e^{-v}.\n",
    "$$\n",
    "再令\n",
    "$$\n",
    "  x = \\sqrt{2v}\\cos 2\\pi u, y = \\sqrt{2v}\\sin 2\\pi u,\n",
    "$$\n",
    "则有  \n",
    "$$\n",
    "2 v = x^2 + y^2\n",
    "$$\n",
    "和\n",
    "$$\n",
    "  \\tan 2 \\pi u =\\frac{y}{x}.\n",
    "$$\n",
    "因此 $X$ 和 $Y$ 的联合分布函数为\n",
    "$$\n",
    "\\begin{equation}\n",
    "    f_{X, Y}(x, y) = f_{U, V}(u(x, y), v(x,\n",
    "    y))\\left|\\frac{\\partial u}{\\partial x}\\frac{\\partial v}{\\partial\n",
    "      y} - \\frac{\\partial u}{\\partial y}\\frac{\\partial v}{\\partial\n",
    "      x}\\right| = \\frac{1}{2 \\pi}e^{-\\frac{x^2 + y^2}{2}}.\n",
    "  \\end{equation}\n",
    "$$\n",
    "则 $f_X$ 和 $f_Y$ 各自的边界分为标准正态分布。证毕。\n",
    "\n",
    "而当前已知生成正态分布最快的方法是由 Marsaglia 在 1964 年提出的rectangle-wedge-tail方法，并在 1972 年由 Ahrens 和 Dieter 修改成 RT 算法。但是他们的方法都需要准备大量的预制表格，这一系方法实现比较繁琐。在不用查表的情况下，生成正态分布最快的方法，它是由 Ahrens 和Dieter 在 1988 年提出的 NA 算法。有兴趣的同学可自行参阅 Fishman1995。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
